了解 System.Exception 类
介绍
编写软件是一项复杂的工作,即使是最好的软件也经常会出现各种问题。有时问题是由糟糕的代码引起的,有时问题是由应用程序代码中未考虑到的错误用户输入引起的。无论问题的原因是什么,最终结果都是应用程序无法按预期运行。此时,我们说应用程序遇到了错误。在 .NET 中,当正在运行的应用程序遇到错误时会引发异常。
什么是异常?
异常是程序中违反系统或应用程序约束的运行时错误,或者是程序正常执行期间不应发生的情况。可能的异常包括尝试连接到不再存在的数据库、程序尝试将数字除以零或打开损坏的 XML 文件。当发生这些情况时,系统会捕获错误并引发异常。
异常类层次结构
在 .NET 中,异常是指错误、错误的用户输入和运行时错误,尽管程序员可能将每个错误视为不同的问题。它们由对象实例表示。我们有不同的异常类来表示不同类型的错误。所有异常类型都继承自System.Exception基类。
SystemException类继承自Exception基类。OutOfMemoryException 、StackOverflowException和ArgumentException类继承自SystemException。ArgumentException类还有另外两个派生自它的类:ArgumentNullException和ArgumentOutOfRangeException类。
ArithmeticException类派生自Exception基类。OverflowException和DivideByZero异常则继承自ArithmeticException类。
我们还有从Exception基类派生的ApplicationException类。此外,我们可以定义自己的异常类,它们可以从Exception基类派生。
System.Exception 类
所有异常最终都派生自 System.Exception 基类,而后者又派生自 System.Object。它有几个构造函数和属性。System.Exception 最重要的属性如下:
StackTrace:这是一个字符串,表示从异常的起源到 catch 块所调用的所有方法。它显示导致异常的路径或流程。这在调试时非常有用。
消息:这是描述所发生错误的字符串。此描述应完整描述错误,如果可能,还应描述错误的位置和解决方法。
InnerException:此属性为System.Exception类型,用于捕获导致当前异常的先前异常。这种捕获和包装先前异常的方式称为异常包装。如果没有导致此异常的异常,则为 null。
异常类的其他属性包括:
数据:此属性为IDictionary类型,它为我们提供键/值对。键为字符串类型,值是对象类型。此属性可以帮助我们提供额外的异常数据。
源:此属性为字符串类型,描述导致错误的应用程序或对象。默认情况下,此属性设置为原始程序集的名称。
HResult:此属性为int类型,表示 HResult 值,通常与 COM 互操作代码一起使用。
HelpLink:此属性为字符串类型,指定与错误相关的帮助文件的链接。它可以是统一资源定位器 (URL) 或统一资源名称 (URN) 的形式。
TargetSite:此属性属于System.Reflection.MethodBase类型,它使我们能够访问引发异常的方法。
常用的 System.Exception 构造函数
Exception类有几个可用的构造函数。最简单的构造函数没有任何参数,并且我们得到一个默认的Message属性和一个空的InnerException属性。
var exception = new Exception();
有一个构造函数重载,它接受一个消息参数,该参数映射到Message属性。此处的InnerException属性也为 null。
var exception = new Exception("error message");
还有一个构造函数重载,它采用一个消息参数(映射到Message属性)和一个innerException参数(映射到InnerException属性并且对于异常包装很有用)。
var exception = new Exception("error message", new Exception());
包起来
在某些时候,应用程序会遇到错误。有时错误是由错误代码引起的,有时是由应用程序代码中未考虑到的虚假用户输入引起的。在 .NET 中,当正在运行的应用程序遇到错误时会引发异常。在本指南中,我们研究了 .Net 中的异常类层次结构,并深入研究了 Exception 类的属性和构造函数, .Net 中的其他异常类型都源自该类。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~