23 捕获和处理异常

在C#编程中,异常是一种不可预见的错误,可能会导致程序崩溃或不可预期的行为。理解如何有效地捕获和处理这些异常,是编写健壮和可靠程序的关键部分。在本篇中,我们将深入探讨异常的捕获与处理机制,并用具体的案例来说明这些概念。

异常捕获

在C#中,捕获异常通常使用try-catch语句。基本的结构如下所示:

1
2
3
4
5
6
7
8
try
{
// 可能引发异常的代码
}
catch (异常类型 异常对象)
{
// 捕获异常后的处理逻辑
}

示例:捕获整数解析异常

我们来看看一个简单的例子,说明如何捕获并处理解析字符串为整数时可能发生的异常。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System;

class Program
{
static void Main()
{
string input = "abc"; // 非法输入
int number;

try
{
number = int.Parse(input);
Console.WriteLine($"解析结果: {number}");
}
catch (FormatException ex)
{
Console.WriteLine($"解析失败: {ex.Message}");
}
catch (OverflowException ex)
{
Console.WriteLine($"数字溢出: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"其他异常: {ex.Message}");
}

Console.WriteLine("程序继续执行...");
}
}

代码解析

在这个示例中,我们的目标是将字符串input解析为整数。然而,input的值是"abc",这会导致FormatException异常。我们在try块中把可能引发异常的代码放置在一起,并在catch块中处理不同类型的异常。通过这种方式,程序不会崩溃,而是能优雅地处理错误情况。

多个捕获块

在处理异常时,可以有多个catch块来处理不同种类的异常。C#会从上到下检查每个catch块,找到合适的处理程序。一旦找到合适的catch,后续的catch块将被忽略。

示例:多种异常处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
try
{
// 可能的多种异常代码
string[] array = new string[2];
array[5] = "Hello"; // 引发 IndexOutOfRangeException
}
catch (IndexOutOfRangeException ex)
{
Console.WriteLine($"数组索引超出范围: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"捕获到的其他异常: {ex.Message}");
}

在上面的代码中,我们尝试访问数组的非法索引,导致IndexOutOfRangeException。我们不仅处理特定的异常,还提供了一个通用的异常处理机制,以捕捉其他可能的异常。

捕获所有类型的异常

如果你不确定异常的种类,可以使用通用catch,它捕获所有异常。最好将它放在所有具体catch块的最后。

1
2
3
4
5
6
7
8
try
{
// 可能抛出任何异常的代码
}
catch (Exception ex) // 捕获所有类型的异常
{
Console.WriteLine($"发生异常: {ex.Message}");
}

注意事项

尽管能够捕获所有异常很方便,但这也有其缺点。使用通用catch可能会隐藏错误的具体信息。因此,在处理异常时应尽量具体化,优先考虑特定异常的捕获与处理。

清理资源

在某些情况下,即使发生了异常,也需要释放资源。这时,可以使用finally块来确保无论发生了什么,特定的代码总会被执行。

示例:使用finally

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FileStream fs = null;

try
{
fs = new FileStream("example.txt", FileMode.Open);
// 文件操作代码
}
catch (IOException ex)
{
Console.WriteLine($"文件操作失败: {ex.Message}");
}
finally
{
if (fs != null)
{
fs.Close(); // 确保文件流被关闭
Console.WriteLine("文件流已关闭。");
}
}

在这个例子中,finally块确保无论是否发生异常,文件流fs都能得到正确地关闭,从而避免资源泄漏。

结束语

在本篇中,我们详细探讨了C#中的异常捕获和处理机制,学习了如何使用try-catch语句处理不同的异常类型,以及finally块在资源清理方面的作用。在下一篇中,我们将进一步了解自定义异常,以便灵活地处理特定的错误情境。希望你能通过实践和不断的编码,掌握异常处理的精髓!

23 捕获和处理异常

https://zglg.work/csharp-zero/23/

作者

AI免费学习网(郭震)

发布于

2024-08-13

更新于

2024-08-13

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论