跳到主要内容

C# 异常处理策略

介绍

在编程中,异常是程序运行时发生的意外情况,例如文件未找到、网络连接失败或无效的用户输入。C# 提供了强大的异常处理机制,允许开发者捕获和处理这些异常,从而确保程序能够优雅地处理错误,而不是崩溃。

本文将介绍 C# 中的异常处理策略,包括如何捕获异常、使用 try-catch-finally 块、处理特定异常类型以及如何自定义异常。我们还将通过实际案例展示这些策略的应用。

异常处理基础

在 C# 中,异常处理主要通过 try-catch-finally 块来实现。以下是其基本结构:

csharp
try
{
// 可能抛出异常的代码
}
catch (Exception ex)
{
// 处理异常的代码
}
finally
{
// 无论是否发生异常,都会执行的代码
}

示例:捕获异常

以下是一个简单的示例,展示了如何捕获和处理异常:

csharp
try
{
int[] numbers = { 1, 2, 3 };
Console.WriteLine(numbers[5]); // 访问越界元素
}
catch (IndexOutOfRangeException ex)
{
Console.WriteLine("发生了数组越界异常: " + ex.Message);
}
finally
{
Console.WriteLine("finally 块执行完毕。");
}

输出:

发生了数组越界异常: Index was outside the bounds of the array.
finally 块执行完毕.
备注

finally 块中的代码无论是否发生异常都会执行,通常用于释放资源或执行清理操作。

捕获特定异常

在实际开发中,我们通常需要捕获特定类型的异常,而不是所有异常。这样可以更精确地处理错误。

示例:捕获特定异常

csharp
try
{
string filePath = "nonexistentfile.txt";
string content = File.ReadAllText(filePath);
}
catch (FileNotFoundException ex)
{
Console.WriteLine("文件未找到: " + ex.Message);
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine("访问被拒绝: " + ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("发生了未知异常: " + ex.Message);
}

输出:

文件未找到: Could not find file 'nonexistentfile.txt'.
提示

始终优先捕获特定异常,最后再捕获通用异常(Exception),以确保不会遗漏任何特定的错误处理逻辑。

自定义异常

在某些情况下,内置的异常类型可能无法满足需求。此时,我们可以创建自定义异常类。

示例:自定义异常

csharp
public class InvalidAgeException : Exception
{
public InvalidAgeException(string message) : base(message) { }
}

public class User
{
public string Name { get; set; }
public int Age { get; set; }

public void ValidateAge()
{
if (Age < 0 || Age > 120)
{
throw new InvalidAgeException("年龄必须在 0 到 120 之间。");
}
}
}

try
{
User user = new User { Name = "John", Age = -5 };
user.ValidateAge();
}
catch (InvalidAgeException ex)
{
Console.WriteLine("无效的年龄: " + ex.Message);
}

输出:

无效的年龄: 年龄必须在 0 到 120 之间。
警告

自定义异常应继承自 Exception 类,并遵循命名约定,以 Exception 结尾。

实际案例:文件处理中的异常处理

假设我们正在开发一个应用程序,需要读取用户提供的文件并处理其中的数据。以下是处理文件读取时可能遇到的异常情况:

csharp
try
{
Console.WriteLine("请输入文件路径:");
string filePath = Console.ReadLine();

string content = File.ReadAllText(filePath);
Console.WriteLine("文件内容: " + content);
}
catch (FileNotFoundException)
{
Console.WriteLine("文件未找到,请检查路径是否正确。");
}
catch (UnauthorizedAccessException)
{
Console.WriteLine("没有权限访问该文件。");
}
catch (IOException ex)
{
Console.WriteLine("发生 I/O 错误: " + ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("发生了未知异常: " + ex.Message);
}
finally
{
Console.WriteLine("文件处理完成。");
}

输出示例:

请输入文件路径:
nonexistentfile.txt
文件未找到,请检查路径是否正确。
文件处理完成.
注意

在处理文件操作时,务必考虑所有可能的异常情况,例如文件不存在、权限不足或 I/O 错误。

总结

异常处理是编写健壮、可靠代码的关键部分。通过使用 try-catch-finally 块,我们可以捕获和处理运行时错误,确保程序在遇到意外情况时不会崩溃。此外,捕获特定异常和自定义异常可以进一步提高代码的可读性和可维护性。

在实际开发中,始终要考虑所有可能的异常情况,并编写相应的处理逻辑。这不仅有助于提升用户体验,还能减少调试和维护的难度。

附加资源与练习

  • 练习 1:编写一个程序,要求用户输入两个数字并执行除法操作。捕获并处理可能发生的 DivideByZeroException
  • 练习 2:创建一个自定义异常类 InvalidEmailException,并在验证电子邮件格式时抛出该异常。
  • 阅读:查阅 Microsoft 官方文档 以了解更多关于 C# 异常处理的高级主题。

通过不断练习和学习,你将能够掌握 C# 异常处理的最佳实践,并编写出更加健壮的代码。