C#实现商品信息的显示异常处理
Posted 教授先生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#实现商品信息的显示异常处理相关的知识,希望对你有一定的参考价值。
实验四:C#实现商品信息的显示异常处理
任务要求:
在进销存管理系统中,商品的库存信息有很多种类,比如商品型号、商品名称、商品库存量等。在面向对象编程中,这些商品的信息可以存储到属性中,然后当需要使用这些信息时,再从对应的属性中读取出来。这里要求定义库存商品结构,并输出库存商品的信息。
整体框架:
实现步骤:
第一步:创建cstockInfo类,并设置如下变量:
第二步:按照如下内容定义商品的13个属性。
第三步:创建cstockInfo类构造函数,并对商品属性进行初始化
第四步:创建显示商品信息函数
第五步:Main函数中输出标题
第六步:创建商品对象,从键盘输入商品编号、单位全称、商品型号、库存数量四个数据,并显示商品信息(自行补充)
第九步:实现对商品输入内容的约束并进行异常处理。(自行补充)
1、库存数量:数字,区间范围:1-1000
2、商品规格:“字符”+“-”+“数字”组成。如:TYPE-3
第九步:实现对商品信息多次输入,并进行判断,输入“q”退出程序。(自行补充)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
class Program
static void Main(string[] args)
Console.WriteLine("库存盘点信息如下:");
cStockInfo csi1 = new cStockInfo();
csi1.TradeCode = "TJRA001";
csi1.FullName = "空调";
csi1.TradeType = "TYPE-1";
csi1.Standard = "2匹";
csi1.Unit = "台";
csi1.Produce = "天津";
csi1.Qty = 200;
csi1.Price = 2000;
csi1.AveragePrice = 2500;
csi1.SalePrice = 3000;
csi1.Check = 200;
csi1.UpperLimit = 800;
csi1.LowerLimit = 200;
csi1.ShowInfo();
cStockInfo csi2 = new cStockInfo();
csi2.TradeCode = "TJRA002";
csi2.FullName = "空调";
csi2.TradeType = "TYPE-2";
csi2.Standard = "1.5匹";
csi2.Unit = "台";
csi2.Produce = "天津";
csi2.Qty = 300;
csi2.Price = 3000;
csi2.AveragePrice = 3500;
csi2.SalePrice = 4000;
csi2.Check = 290;
csi2.ShowInfo();
cStockInfo csi3 = new cStockInfo();
csi3.TradeCode = "TJRA003";
csi3.TradeType = "TYPE-3";
csi3.ShowInfo();
Console.ReadLine();
ConsoleKey Key;
do
Key = Console.ReadKey().Key;
while (Key != ConsoleKey.Q
);
public class cStockInfo
private string tradecode = "";
private string fullname = "";
private string tradetype = "";
private string standard = "";
private string tradeunit = "";
private string produce = "";
private float qty = 0;
private float price = 0;
private float averageprice = 0;
private float saleprice = 0;
private float check = 0;
private float upperlimit = 0;
private float lowerlimit = 0;
public string TradeCode
get return tradecode;
set tradecode = value;
public string FullName
get return fullname;
set fullname = value;
public string TradeType
get return tradetype;
set tradetype = value;
public string Standard
get return standard;
set standard = value;
public string Unit
get return tradeunit;
set tradeunit = value;
public string Produce
get return produce;
set produce = value;
public float Qty
get return qty;
set qty = value;
public float Price
get return price;
set price = value;
public float AveragePrice
get return averageprice;
set averageprice = value;
public float SalePrice
get return saleprice;
set saleprice = value;
public float Check
get return check;
set check = value;
public float UpperLimit
get return upperlimit;
set upperlimit = value;
public float LowerLimit
get return lowerlimit;
set lowerlimit = value;
public cStockInfo()
this.TradeCode = "TJRA001";
this.FullName = "空调";
this.TradeType = "TYPE-2";
this.Standard = "2匹";
this.Unit = "台";
this.Produce = "天津";
this.Qty = 200;
this.Price = 2000;
this.AveragePrice = 2500;
this.SalePrice = 3000;
this.Check = 200;
this.UpperLimit = 900;
this.LowerLimit = 100;
public void ShowInfo()
Console.WriteLine("------------------------------------------");
Console.WriteLine("显示商品信息");
Console.WriteLine("");
Console.Write("商品编号:0,-15", TradeCode);
Console.Write("单位全称:0,-15", FullName);
Console.Write("商品型号:0,-15", TradeType);
Console.WriteLine("");
Console.Write("商品规格:0,-15", Standard);
Console.Write("商品单位:0,-15", Unit);
Console.Write("商品产地:0,-15", Produce);
Console.Write("库存数量:0,-15", Qty);
Console.WriteLine("");
Console.Write("最后一次价格:0,-15:C", Price);
Console.Write("加权平均价格:0,-15:C", AveragePrice);
Console.Write("最后一次销售:0,-15:C", SalePrice);
Console.WriteLine("");
Console.Write("盘点数量:0,-15", Check);
Console.Write("库存报警上限:0,-15", UpperLimit);
Console.Write("库存报警下限:0,-15", LowerLimit);
Console.WriteLine("");
Console.WriteLine("商品信息显示完毕");
Console.WriteLine("------------------------------------------");
C#异常处理总结
- Exception类分析
- 常见的异常类
- 异常捕获
- 异常处理原则和建议
SystemException类继承Exception,前者是System命名空间中所有其他异常类的基类,在捕获异常的时候,我首先查看的就是Exception对象信息。Exception重要成员如下图
这里写图片描述
1.Message属性:产生异常原因的错误消息
[__DynamicallyInvokable] public virtual string Message { [__DynamicallyInvokable] get { if (this._message != null) { return this._message; } if (this._className == null) { this._className = this.GetClassName(); } return Environment.GetRuntimeResourceString("Exception_WasThrown", new object[] { this._className }); } }
Message属性是只读属性,GetRuntimeResourceString是获取运行时资源字符串。返回的字符串是产生异常原因的错误消息或者空字符串。
2.Data:的其他异常信息的键/值对的集合
public virtual IDictionary Data { get{ if (_data == null) if(IsImmutableAgileException(this))
_data = new EmptyReadOnlyDictionaryInternal(); else _data = new ListDictionaryInternal(); return _data; } }
3.StackTrace:出现异常之前调用的方法名称和签名
public static string StackTrace { [SecuritySafeCritical] get { new EnvironmentPermission(PermissionState.Unrestricted).Demand(); return GetStackTrace(null, true); } }
4.Source属性:包含生成异常的应用程序或对象的名称
5.TargetSite属性:引发当前异常的方法
6.GetBaseException方法 :返回System.Exception,它是所有异常类的“基”类。
常见的异常类
异常类型有很多,他们都是继承自SystemException,这些异常类型大概分为以下这几种1.与数组集合有关2.与成员访问有关3.与参数有关4.与算术相关5.IO相关6.当然还有其他的一些异常。
1.与数组集合有关
IndexOutOfRangeException类:索引超出范围引发的异常
ArrayTypeMismatchException类:数组集合存储数据类型不正确引发的异常
RankException类:处理维数错误引发的异常
2.IO有关的异常
与IO相关的异常都继承自IOException类,该类用于处理进行文件输入输出操作时所引发的异常,IOException类的5个直接派生类如下。
DirectoryNotFoundException类:没有找到指定的目录而引发的异常。
FileNotFoundException类:没有找到文件而引发的异常。
EndOfStreamException类:处理已经到达流的末尾而还要继续读数据而引发的异常。
FileLoadException类:无法加载文件而引发的异常。
PathTooLongException类:文件名太长而引发的异常。
3.成员访问有关的异常
与成员访问相关的异常都继承自MemberAccessException这个类,它继承自SystemException。
FileAccessException:访问字段成员失败所引发的异常
MethodAccessException:访问方法成员失败引发异常
MissingMemberException:成员不存在引发的异常
4.参数相关的异常
与参数有关的异常类ArgumentException都继承自SystemException,处理给方法成员传递参数时发生异常
ArgumentOutOfRangeException:当一个参数不在给定范围内引发的异常
ArgumentNullException:参数为null(不允许null)的情况下引发的异常
5..与算术相关
ArithmeticException异常类用于处理与算术相关的异常,它的相关子类如下
DivideByZeroException:整数十进制试图除以0引发的异常(被除数不能为0)
NotFiniteNumberException:浮点数运算中出现无穷大或非负值引发的异常
6.其他异常
NullReferenceException:当一个对象没有实例化时并引用引发的异常
InvalidOperationException:当对方法的调用对象当前状态无效时引发异常
InvalidCastException:处理类型转换期间引发的异常
OutOfMemoryException:处理内存不足引发的异常
StackOverflowException:处理栈溢出引发的错误
异常捕获
c#中提供try 和catch块提供了一种结构化的异常处理方案,所有可能出现的异常都必须得到妥善的处理,try catch本身并不会影响系统的性能,在没有发生异常的时候try catch 是不会影响系统性能的。受影响的时候是发生异常的时候。
关键字 try catch finally。先执行try里面的语句,如果抛出异常就会被catch捕获。无论出不出现异常都会执行finally里面的语句。另外不常用的throw关键字:当问题出现时,程序抛出一个异常。
class Program { static void Main(string[] args) { DivideNumber div = new DivideNumber(); div.DivideMethod(2, 0); Console.ReadKey(); } } class DivideNumber { int result; public DivideNumber() { result = 0; } public void DivideMethod(int a,int b) { try { result = a / b; } catch (DivideByZeroException e) { Console.WriteLine("exception,被除数不能为0,e.message:" + e.Message); } finally { Console.WriteLine($"{a}除以{b}的结果是"+result); } } }
异常处理原则和建议
在实际的开发中,异常到底需要怎么写,还是和系统的稳定性和容错性有一定要求的。
要捕获具体的异常
在捕获异常的时候,我们经常习惯性写catch(Exception ex) ,这个并非具体的异常,最好是能具体到ArgumentException、FormatException等异常类,不要抛出”new Exception()”
catch中啥也不干,异常要向顶层抛出
这种情况在自己写demo的时候可能比较常见,在编写catch(Exception ex)这块代码下啥也不干,不要这样做。切记出现的异常要想顶层抛出
合理使用finally块
finally关键字是不管抛出什么类型异常都会被执行,大多数的时候能在finally块下执行的代码,也能写在catch里面。那么finally关键字到底在什么情况下使用比较合适呢,比如清理资源,关闭流,回复状态等。
抛出的异常要记录下来
当然程序中出现的异常并不是所有都要记录下来,有些异常还是记录下来便于分析具体的问题。一些记录日志库 log4net ,EIF……
不要只记录Exception.Message的值,还需要记录Exception.ToString()
刚刚前面的例子,我打印的e.Message ,仅仅只是输出“尝试除以0”,提示的错误信息不具体,并不推荐这样做。Tostring方法中包含了stacktrace、内部异常信息、Message…..通常这些信息比仅一个Message更重要
不要将“抛出异常”作为函数执行结果的一种
“抛出异常”应该向顶层抛出,但是不能作为方法执行结果的一种,方法的结果不能是异常类。
每个线程要包含一个try/catch块
创建子线程去执行任务时,主线程不会知道子线程的异常情况,所以每个线程都需要一个try、catch.
来自“代码思考者“的评论
之前在做C#项目的项目经理时,我也思考过如何有效地在项目团队中实践异常的处理。
首先,异常处理应该是系统设计规约的一部分出现在系统设计文档中,而不仅仅是一种技术实现。
作为设计文档的一部分,异常处理应该着眼于系统容错性和稳定性(正如楼主提到的那样)。然后在根据这个规约,再来具体讨论和选择异常处理中使用的各种技术细则。
比如,在设计服务时,必须在服务的调用接口处有异常处理,否则客户端传过来的任何有害数据都可能让服务器挂掉。
比如,对异常的处理在系统的设计中,必须有明确说明,不能随便在哪个模块中处理异常。
以上是我的个人经验,还望走过的朋友多多交流。
作者:张林 标题:C#异常处理总结
原文地址:http://blog.csdn.net/kebi007/article/details/78221083 转载随意注明出处
以上是关于C#实现商品信息的显示异常处理的主要内容,如果未能解决你的问题,请参考以下文章