异常
理解异常体系与处理机制
掌握 try-catch-finally 结构
学会抛出异常与自定义异常
核心讲解
(1)异常体系
所有异常都继承自 Exception 基类。
常见异常:
NullReferenceException:空引用异常IndexOutOfRangeException:索引越界ArgumentException:参数错误IOException:IO 异常DivideByZeroException:除零异常
(2)异常处理 try-catch-finally
try
{
// 可能出错的代码
}
catch (具体异常类型 e)
{
// 捕获对应异常,处理
}
finally
{
// 无论是否异常,一定执行,释放资源
}
可以多个 catch,从小到大写
finally 一定会执行,哪怕 try 里有 return
只有
System.Exit()能让 finally 不执行
(3)抛出异常
用 throw 关键字抛出异常对象。
主动抛出参数错误、业务错误
不要吞异常,该抛要抛
(4)自定义异常
继承 Exception,用来表示业务特定的错误。
操作步骤
编写异常捕获代码
自定义业务异常
抛出并捕获测试
运行验证
代码示例
// 自定义异常
public class AgeException : Exception
{
public AgeException(string message) : base(message)
{
}
}
static void SetAge(int age)
{
if (age < 0 || age > 120)
{
// 抛出自定义异常
throw new AgeException("年龄不合法:" + age);
}
Console.WriteLine("年龄设置成功:" + age);
}
// ===== 异常处理 =====
try
{
int[] arr = { 1, 2, 3 };
Console.WriteLine(arr[5]); // 索引越界异常
}
catch (IndexOutOfRangeException e)
{
Console.WriteLine("捕获到索引越界:" + e.Message);
}
finally
{
Console.WriteLine("finally 一定会执行");
}
Console.WriteLine("\n--- 自定义异常测试 ---");
try
{
SetAge(150);
}
catch (AgeException e)
{
Console.WriteLine("年龄异常:" + e.Message);
}
Console.ReadKey();
常见误区
空 catch 吞异常:什么都不处理,等于把错误藏起来,排查问题非常困难
finally 里写 return:finally 里的 return 会覆盖 try 里的返回值,非常坑
抛出异常用 throw ex:会丢堆栈信息,直接 throw; 就好
用异常控制正常流程:异常是处理错误的,不要用来做正常业务逻辑
课后练习
写一个除法方法,捕获除零异常
自定义一个用户名不能为空的异常
写一个登录方法,用户名为空时抛出自定义异常
简述 try、catch、finally 三个块的作用
