打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
创建和引发异常(C# 编程指南) | Microsoft Docs

异常用于指示在运行程序时发生了错误。 此时将创建一个描述错误的异常对象,然后使用 throw 关键字引发。 然后,运行时搜索最兼容的异常处理程序。

当存在下列一种或多种情况时,程序员应引发异常:

  • 方法无法完成其定义的功能。

    例如,如果一种方法的参数具有无效的值:

    C#
    static void CopyObject(SampleClass original){    if (original == null)    {        throw new System.ArgumentException("Parameter cannot be null", "original");    }}
  • 根据对象的状态,对某个对象进行不适当的调用。

    一个示例可能是尝试写入只读文件。 在对象状态不允许操作的情况下,引发 InvalidOperationException 的实例或基于此类的派生的对象。 这是引发 InvalidOperationException 对象的方法示例:

    C#
    class ProgramLog{    System.IO.FileStream logFile = null;    void OpenLog(System.IO.FileInfo fileName, System.IO.FileMode mode) {}    void WriteLog()    {        if (!this.logFile.CanWrite)        {            throw new System.InvalidOperationException("Logfile cannot be read-only");        }        // Else write data to the log and return.    }}
  • 方法的参数引发了异常。

    在这种情况下,应捕获原始异常,并创建 ArgumentException 实例。 应将原始异常作为 InnerException 参数传递给 ArgumentException 的构造函数:

    C#
    static int GetValueFromArray(int[] array, int index){    try    {        return array[index];    }    catch (System.IndexOutOfRangeException ex)    {        System.ArgumentException argEx = new System.ArgumentException("Index is out of range", "index", ex);        throw argEx;    }}

异常包含一个名为 StackTrace 的属性。 此字符串包含当前调用堆栈上的方法的名称,以及为每个方法引发异常的位置(文件名和行号)。 StackTrace 对象由公共语言运行时 (CLR) 从 throw 语句的位置点自动创建,因此必须从堆栈跟踪的开始点引发异常。

所有异常都包含一个名为 Message 的属性。 应设置此字符串来解释发生异常的原因。 请注意,不应将安全敏感的信息放在消息文本中。 除 Message 以外,ArgumentException 也包含一个名为 ParamName 的属性,应将该属性设置为导致引发异常的参数的名称。 对于属性资源库,ParamName 应设置为 value

公共的受保护方法成员在无法完成其预期功能时应引发异常。 引发的异常类应是符合错误条件的最具体的可用异常。 这些异常应编写为类功能的一部分,并且原始类的派生类或更新应保留相同的行为以实现后向兼容性。

引发异常时应避免的情况

以下列表标识了引发异常时要避免的做法:

  • 异常不能用于在正常执行过程中更改程序的流程。 异常只能用于报告和处理错误条件。

  • 只能引发异常,而不能作为返回值或参数返回异常。

  • 请勿有意从自己的源代码中引发 System.ExceptionSystem.SystemExceptionSystem.NullReferenceExceptionSystem.IndexOutOfRangeException

  • 不要创建可在调试模式下引发,但不会在发布模式下引发的异常。 若要在开发阶段确定运行时错误,请改用调试断言。

定义异常类

程序可以引发 System 命名空间中的预定义异常类(前面提到的情况除外),或通过从 Exception 派生来创建其自己的异常类。 派生类应至少定义四个构造函数:一个默认构造函数、一个用于设置消息属性的构造函数,以及一个用于设置 MessageInnerException 属性的构造函数。 第四个构造函数用于序列化异常。 新的异常类应可序列化。 例如:

C#
[Serializable()]public class InvalidDepartmentException : System.Exception{    public InvalidDepartmentException() : base() { }    public InvalidDepartmentException(string message) : base(message) { }    public InvalidDepartmentException(string message, System.Exception inner) : base(message, inner) { }    // A constructor is needed for serialization when an    // exception propagates from a remoting server to the client.     protected InvalidDepartmentException(System.Runtime.Serialization.SerializationInfo info,        System.Runtime.Serialization.StreamingContext context) { }}

只有当新属性提供的数据有助于解决异常时,才应将其添加到异常类中。 如果将新属性添加到派生异常类中,则应替代 ToString() 以返回添加的信息。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
.NET 开发中的异常处理
解析Exception和C#处理Exception的常用方法总结
C#路径中获取文件全路径、目录、扩展名、文件名称常用函数
如何:使用数据保护
C#学习第十六天
V7.3预定义异常类
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服