【C#零基础从入门到精通】(二十八)——C#try异常处理详解
在 C# 中,异常处理是一种用于处理程序运行时出现的错误或异常情况的机制。它可以帮助开发者捕获并处理可能出现的异常,避免程序因异常而崩溃,提高程序的健壮性和稳定性。以下是关于 C# 异常处理的详细介绍:
1. 异常的基本概念
异常是指在程序执行过程中出现的意外或错误情况,例如除零错误、空引用错误、文件未找到等。在 C# 中,异常是通过 Exception
类及其派生类来表示的。当异常发生时,程序会抛出一个异常对象,该对象包含了有关异常的信息,如异常类型、错误消息等。
2. 异常处理的语法结构
C# 提供了 try
、catch
、finally
块来实现异常处理,其基本语法如下:
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# 的异常处理机制为开发者提供了一种有效的方式来处理程序运行时的错误和异常情况。通过合理使用 try
、catch
、finally
块,以及抛出异常、异常过滤器和自定义异常等功能,可以提高程序的健壮性和可维护性。