📌  相关文章
📜  C#|例外(1)

📅  最后修改于: 2023-12-03 15:14:28.336000             🧑  作者: Mango

C# 异常处理

在编程的过程中,我们难免会遇到错误或异常情况,这时我们需要对它们进行处理。C# 中的异常处理机制提供了一个标准的方法来处理这些情况,程序员可以利用这个机制确保程序能够正常运行。

异常处理的分类

C# 的异常处理可以分为三大类:

  • 系统异常:由运行时库或操作系统引发的异常,例如:StackOverflowExceptionOutOfMemoryException
  • 自定义异常:自己编写的异常,继承自 Exception 或其子类。
  • 应用异常:业务代码中由程序员引发的异常。
异常处理的基本语法

在 C# 中,异常处理的基本结构为 try-catch 语句块,结构如下:

try
{
    // 可能会抛出异常的代码块
}
catch (ExceptionType1 ex)
{
    // 处理 ExceptionType1 类型的异常
}
catch (ExceptionType2 ex)
{
    // 处理 ExceptionType2 类型的异常
}
finally
{
    // 可选的 finally 代码块,无论是否发生异常都会执行
}

例如:

try
{
    // 可能会抛出异常的代码块
}
catch (DivideByZeroException ex)
{
    // 处理除以零异常
}
catch (Exception ex)
{
    // 处理其他异常
}
finally
{
    // 可选的 finally 代码块,无论是否发生异常都会执行
}
try-catch 块的执行顺序

当程序执行到 try 块时,会依次执行其中的语句,当程序执行出现错误或异常时,就会跳转到 catch 块。catch 块则会依照代码顺序依次匹配异常类型,匹配成功后执行相应的处理代码,如果没有匹配到对应类型的异常,则会将该异常向上抛出,由上层调用者处理。

当所有的 catch 块执行完毕后,会继续执行 finally 块中的代码。finally 代码块是可选的,不管是否发生了异常,finally 代码块中的代码都会被执行。

抛出异常

在 C# 中,通过 throw 关键字可以抛出一个异常对象。例如:

if (age < 0)
{
    throw new ArgumentException("年龄不能小于零");
}

程序员也可以自定义异常类型,例如:

class MyException : Exception
{
    public MyException(string message) : base(message)
    {
    }
}

然后可以使用以下方式来抛出自定义异常:

throw new MyException("这是自定义异常");
关于异步操作

在异步方法中,应该在返回值类型前加 TaskTask<TResult>。在异步操作中出现异常时,异常将会捆绑到 Task 对象中,调用者可以通过 Task.Exception 属性获取异常信息。

例如:

async Task<bool> DoAsync()
{
    try
    {
        // 异步操作
        return true;
    }
    catch(Exception ex)
    {
        // 处理异常或重新抛出异常
        throw;
    }
}
总结

在 C# 中,异常处理是处理程序中可能出现的问题的标准方法。使用 try-catch 语句,程序员可以处理系统错误、自定义异常和应用异常。在处理异步方法时,需在返回值类型前加 TaskTask<TResult>,并在 catch 块中将异常重新抛出以便调用者可以获取异常信息。