C# 系列教程:异常处理
在本篇文章中,我们将介绍 C# 中的异常处理,包括 try-catch 语句、异常的类型和自定义异常。异常处理是编写健壮、可靠程序的重要部分。
目录
什么是异常
异常是程序运行过程中出现的错误或意外情况。异常会中断程序的正常执行流程,若不加处理,程序会终止。
异常处理基础
try-catch 语句
try-catch 语句用于捕获和处理异常。
语法
try
{
// 可能引发异常的代码
}
catch (ExceptionType ex)
{
// 处理异常的代码
}
示例
try
{
int a = 10;
int b = 0;
int result = a / b; // 可能引发除以零异常
}
catch (DivideByZeroException ex)
{
Console.WriteLine("除以零错误: " + ex.Message);
}
finally 语句
finally 语句用于执行在 try 块和 catch 块之后始终执行的代码。无论是否发生异常,finally 块中的代码都会执行。
语法
try
{
// 可能引发异常的代码
}
catch (ExceptionType ex)
{
// 处理异常的代码
}
finally
{
// 始终执行的代码
}
示例
FileStream file = null;
try
{
file = new FileStream("example.txt", FileMode.Open);
// 读取文件
}
catch (FileNotFoundException ex)
{
Console.WriteLine("文件未找到: " + ex.Message);
}
finally
{
if (file != null)
{
file.Close(); // 关闭文件
}
}
异常的类型
系统异常
系统异常是由 .NET 框架引发的异常,例如 DivideByZeroException
、NullReferenceException
等。
示例
try
{
int[] array = new int[5];
int value = array[10]; // 可能引发索引超出范围异常
}
catch (IndexOutOfRangeException ex)
{
Console.WriteLine("索引超出范围: " + ex.Message);
}
应用程序异常
应用程序异常是由应用程序代码引发的异常,例如自定义异常。
自定义异常
自定义异常用于在应用程序中引入特定的异常类型。自定义异常类通常继承自 Exception
类。
创建自定义异常
语法
public class MyCustomException : Exception
{
public MyCustomException() { }
public MyCustomException(string message) : base(message) { }
public MyCustomException(string message, Exception inner) : base(message, inner) { }
protected MyCustomException(
System.Runtime.Serialization.SerializationInfo info,
System.Runtime.Serialization.StreamingContext context) : base(info, context) { }
}
示例
public class InvalidAgeException : Exception
{
public InvalidAgeException() : base("年龄无效") { }
public InvalidAgeException(string message) : base(message) { }
}
public class Person
{
private int age;
public int Age
{
get { return age; }
set
{
if (value < 0 || value > 120)
{
throw new InvalidAgeException("年龄必须在 0 到 120 之间");
}
age = value;
}
}
}
try
{
Person person = new Person();
person.Age = -5; // 可能引发自定义异常
}
catch (InvalidAgeException ex)
{
Console.WriteLine("错误: " + ex.Message);
}
异常处理的最佳实践
- 只捕获需要处理的异常:不要捕获所有异常,应该只捕获那些你可以处理的异常。
- 提供有用的错误信息:异常信息应该描述性强,以便调试和解决问题。
- 记录异常:在 catch 块中记录异常信息,以便日后分析和调试。
- 避免在 catch 块中执行复杂逻辑:catch 块中应该只包含处理异常的必要逻辑。
- 使用 finally 块释放资源:确保在 finally 块中释放资源,如文件句柄、数据库连接等。
通过掌握这些异常处理技术和最佳实践,您可以编写更健壮和可靠的 C# 程序。
下一篇文章将介绍 C# 中的文件操作,包括文件的读取、写入和管理。敬请期待!