C# 异常类(Exception)

一、介绍

在 C# 中,异常处理是一种机制,用于在程序执行过程中检测和响应错误或异常情况。异常是指在程序执行期间发生的意外或不可预测的事件,这些事件可能会干扰程序的正常流程。

异常处理的主要目标是:

  1. 检测异常:当发生错误或异常情况时,C# 运行时会抛出一个异常对象。这个对象包含有关异常的信息,如异常类型、异常消息以及导致异常的源代码位置。
  2. 处理异常:程序员可以编写代码来处理异常,以确保程序能够优雅地恢复或终止执行,而不会导致程序崩溃或数据损坏。

在 C# 中,异常处理通常通过以下几个关键字和构造来实现:

  1. try:try 块用于包含可能会引发异常的代码。
  2. catch:catch 块用于捕获和处理 try 块中抛出的异常。catch 块可以针对不同类型的异常进行匹配,并执行相应的处理代码。
  3. finally:finally 块用于包含在 try 块中的代码无论是否引发异常都会执行的代码。通常在 finally 块中进行资源清理或者释放。
  4. throw:throw 关键字用于手动引发异常。程序员可以使用 throw 关键字在任何地方引发自定义的异常。

二、异常类

异常类

描述

Exception

所有异常的基类。

SystemException

所有系统异常的基类。

ApplicationException

应用程序特定异常的基类。

IndexOutOfRangeException

当数组索引超出范围时引发的异常。

ArgumentNullException

当参数为 null 时引发的异常。

ArgumentException

当参数无效时引发的异常。

InvalidOperationException

当对象处于不正确状态时引发的异常。

FormatException

当格式无效时引发的异常。

DivideByZeroException

当除以零时引发的异常。

NullReferenceException

当尝试访问 null 对象成员时引发的异常。

FileNotFoundException

当文件未找到时引发的异常。

IOException

输入/输出操作失败时引发的异常。

NotSupportedException

当调用不支持的方法时引发的异常。

OutOfMemoryException

当系统没有足够内存执行所请求的操作时引发的异常。

OverflowException

当算术运算结果溢出范围时引发的异常。

TimeoutException

当操作超时时引发的异常。

InvalidOperationException

当对象处于无效状态时引发的异常。

KeyNotFoundException

在尝试访问集合中不存在的键时引发的异常。

AggregateException

包含一个或多个错误的聚合异常。

三、用户定义的异常类

当您需要创建更复杂的自定义异常类时,可以添加额外的字段、属性、方法或者覆盖基类的方法。以下是一个稍微复杂一点的示例,演示如何扩展自定义异常类:

// 自定义异常类继承自 Exception 类
public class CustomException : Exception
{
    // 自定义异常类的额外属性
    public DateTime Timestamp { get; }

    // 构造函数可以接受消息参数,并传递给基类的构造函数
    public CustomException(string message) : base(message)
    {
        Timestamp = DateTime.Now;
    }

    // 自定义异常类的构造函数,接受消息和内部异常参数,并传递给基类的构造函数
    public CustomException(string message, Exception innerException) : base(message, innerException)
    {
        Timestamp = DateTime.Now;
    }

    // 自定义异常类的方法
    public void LogException()
    {
        // 在此方法中记录异常
        Console.WriteLine($"Exception logged at: {Timestamp}");
    }

    // 可以覆盖基类的方法,以提供自定义的异常信息格式
    public override string ToString()
    {
        return $"Custom Exception: {Message} (Occurred at: {Timestamp})";
    }

四、调用者信息

using System;
using System.Diagnostics;

public class CustomException : Exception
{
    public string CallerMethodName { get; }
    public string CallerClassName { get; }

    public CustomException(string message) : base(message)
    {
        // 获取调用者信息
        var frame = new StackFrame(1);
        CallerMethodName = frame.GetMethod().Name;
        CallerClassName = frame.GetMethod().DeclaringType.Name;
    }

    public override string ToString()
    {
        return $"Custom Exception: {Message}\nCaller Method: {CallerMethodName}\nCaller Class: {CallerClassName}";
    }
}

class Program
{
    static void Main()
    {
        try
        {
            ThrowException();
        }
        catch (CustomException ex)
        {
            Console.WriteLine(ex);
        }
    }

    static void ThrowException()
    {
        throw new CustomException("自定义异常消息");
    }
}

 

posted @ 2024-03-19 16:31  咸鱼翻身?  阅读(719)  评论(0编辑  收藏  举报