C# -- 异常(二)
抛出异常
异常可以被运行时或者用户抛出。比如:
直接传入一个null,然后在try里调用方法,catch捕获异常。这就相当于用户抛出一个异常。
在C#7之前,throw是个语句,而现在它可以作为exception-bodied functions里的一个表达式:
也可以出现在三元表达式里:
重新抛出异常
比如我们需要记录日志,需要把异常抛出,记录一下!等等....
如果使用throw ex代替throw的话,程序仍可运行,但是新传递的异常的stacktrace属性就不会反应原始错误了。
重新抛出异常可用于需要记录错误但是并不将异常隐藏的情形,也可以在异常超出处理范围的情况下放弃对异常进行处理,比如:
从C# 6.0开始,上述例子可以使用异常筛选器简写成:
另一种常见情形是重新抛出某个明确类型的异常,例如:
• 请注意,当构建XmlException时,我们将原始的异常ex作为第二个参数。这个参数将作为新异常的InnerException属性而辅助诊断。几乎所有类型的异常都提供了类似的构造器。
• 在跨越信任边界时,常用做法是重新抛出一个不那么明确的异常,以防止技术信息泄露而给黑客可乘之机。
System.Exception的关键属性
· StackTrace:表示一个异常从起源到catch块的所有调用方法的字符串。
· Message:描述异常的字符串。
· InnerException:导致外部异常的内部异常(如果有的话)。而内部异常本身也可以有另外一个InnerException。
常用的异常类型
以下所列的异常类型在CLR和.NET Framework中广泛使用,可以在程序中抛出这些异常或者将其作为基类型来派生自定义的异常类型:
· System.ArgumentException:当使用不恰当的函数参数调用函数时抛出。这通常表明应用程序有缺陷。
· System.ArgumentNullException:ArgumentException的子类。它在函数的参数(意外的)为null时抛出。
· System.ArgumentOutOfRangeException:ArgumentException的子类。当(通常是数字)参数太大或者太小的时候抛出。例如,当向只能接受正数的函数传递负数时抛出。
· System.InvalidOperationException:当不论参数值如何,对象的状态无法使方法成功执行的时候抛出。例如,读取未打开的文件或在列表对象已修改的情况下用枚举器访问其下一个元素。
· System.NotSupportedException:该异常抛出表示不支持特定的功能。例如,在一个IsReadOnly为true的集合上调用Add方法。· System.NotImplementedException:表示特定的函数还没有实现。
· System.ObjectDisposedException:当函数调用的对象已被销毁时抛出。另一个常见的异常类型是NullReferenceException。当一个对象的值为null而访问其成员时,CLR就会抛出这个异常(表示代码有缺陷)。使用下面的语句会直接抛出一个NullReferenceException异常(仅用于测试目的):