【C#零基础从入门到精通】(二十八)——C#try异常处理详解

【C#零基础从入门到精通】(二十八)——C#try异常处理详解

在 C# 中,异常处理是一种用于处理程序运行时出现的错误或异常情况的机制。它可以帮助开发者捕获并处理可能出现的异常,避免程序因异常而崩溃,提高程序的健壮性和稳定性。以下是关于 C# 异常处理的详细介绍:

1. 异常的基本概念

异常是指在程序执行过程中出现的意外或错误情况,例如除零错误、空引用错误、文件未找到等。在 C# 中,异常是通过 Exception 类及其派生类来表示的。当异常发生时,程序会抛出一个异常对象,该对象包含了有关异常的信息,如异常类型、错误消息等。

2. 异常处理的语法结构

C# 提供了 trycatchfinally 块来实现异常处理,其基本语法如下:

try
{
    // 可能会抛出异常的代码
}
catch (ExceptionType1 ex1)
{
    // 处理 ExceptionType1 类型的异常
}
catch (ExceptionType2 ex2)
{
    // 处理 ExceptionType2 类型的异常
}
finally
{
    // 无论是否发生异常,都会执行的代码
}
  • try 块:包含可能会抛出异常的代码。如果在 try 块中发生异常,程序会立即跳转到相应的 catch 块进行异常处理。
  • catch 块:用于捕获和处理特定类型的异常。可以有多个 catch 块,每个 catch 块可以捕获不同类型的异常。catch 块中的参数 ex 是捕获到的异常对象,可以通过该对象获取异常的详细信息。
  • finally 块:无论 try 块中是否发生异常,finally 块中的代码都会被执行。通常用于释放资源,如关闭文件、数据库连接等。

3. 异常处理的示例

class Program
{
    static void Main()
    {
        try
        {
            int[] numbers = { 1, 2, 3 };
            // 尝试访问数组越界的元素,会抛出 IndexOutOfRangeException 异常
            Console.WriteLine(numbers[10]); 
        }
        catch (IndexOutOfRangeException ex)
        {
            Console.WriteLine($"发生数组越界异常: {ex.Message}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"发生其他异常: {ex.Message}");
        }
        finally
        {
            Console.WriteLine("无论是否发生异常,都会执行这里的代码。");
        }
    }
}

在上述代码中,try 块中尝试访问数组越界的元素,会抛出 IndexOutOfRangeException 异常。程序会跳转到第一个匹配的 catch 块(即捕获 IndexOutOfRangeException 类型异常的 catch 块)进行处理,输出异常信息。最后,finally 块中的代码会被执行。

4. 抛出异常

在 C# 中,可以使用 throw 关键字手动抛出异常。通常在某些条件不满足时,开发者可以主动抛出异常,通知调用者发生了错误。

class Calculator
{
    public int Divide(int dividend, int divisor)
    {
        if (divisor == 0)
        {
            // 手动抛出 DivideByZeroException 异常
            throw new DivideByZeroException("除数不能为零。"); 
        }
        return dividend / divisor;
    }
}

class Program
{
    static void Main()
    {
        Calculator calc = new Calculator();
        try
        {
            int result = calc.Divide(10, 0);
            Console.WriteLine($"结果: {result}");
        }
        catch (DivideByZeroException ex)
        {
            Console.WriteLine($"发生除零异常: {ex.Message}");
        }
    }
}

在这个例子中,Divide 方法在除数为零时手动抛出了 DivideByZeroException 异常,调用者可以捕获并处理该异常。

5. 异常过滤器

C# 还支持异常过滤器,允许在 catch 块中添加额外的条件,只有当条件满足时才会执行该 catch 块。异常过滤器使用 when 关键字来指定条件。

class Program
{
    static void Main()
    {
        try
        {
            int[] numbers = { 1, 2, 3 };
            Console.WriteLine(numbers[10]);
        }
        catch (IndexOutOfRangeException ex) when (ex.Message.Contains("10"))
        {
            Console.WriteLine($"发生数组越界异常,索引为 10: {ex.Message}");
        }
        catch (IndexOutOfRangeException ex)
        {
            Console.WriteLine($"发生数组越界异常: {ex.Message}");
        }
    }
}

在上述代码中,第一个 catch 块使用了异常过滤器,只有当异常消息包含 "10" 时才会执行该 catch 块,否则会执行第二个 catch 块。

6. 自定义异常

除了使用 .NET 框架提供的内置异常类,开发者还可以自定义异常类。自定义异常类通常继承自 Exception 类或其派生类。

// 自定义异常类
class MyCustomException : Exception
{
    public MyCustomException() : base() { }
    public MyCustomException(string message) : base(message) { }
    public MyCustomException(string message, Exception innerException) : base(message, innerException) { }
}

class Program
{
    static void Main()
    {
        try
        {
            // 手动抛出自定义异常
            throw new MyCustomException("这是一个自定义异常。"); 
        }
        catch (MyCustomException ex)
        {
            Console.WriteLine($"发生自定义异常: {ex.Message}");
        }
    }
}

在这个例子中,MyCustomException 是一个自定义异常类,继承自 Exception 类。在 Main 方法中,手动抛出了该自定义异常,并在 catch 块中进行了处理。

综上所述,C# 的异常处理机制为开发者提供了一种有效的方式来处理程序运行时的错误和异常情况。通过合理使用 trycatchfinally 块,以及抛出异常、异常过滤器和自定义异常等功能,可以提高程序的健壮性和可维护性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Csharp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值