平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“C# try-catch 异常处理的实现方法”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
异常:程序运行期间出现的错误,会导致程序直接崩溃退出。
异常处理作用:捕捉错误、给出友好提示、保证程序不崩溃、能够重试操作。
核心语法:try-catch-finally
Exception:所有异常的父类/基类,能够捕获所有异常,必须写在最后
异常类型 | 触发场景 |
|---|---|
FormatException | 数据格式错误(字符串转数字格式非法) |
OverflowException | 数值超出数据类型范围(int最大值/最小值溢出) |
DivideByZeroException | 除数为0异常 |
IndexOutOfRangeException | 数组/集合索引越界 |
NullReferenceException | 空引用异常(对象为null调用属性/方法) |
需求:输入数字计算10的N次方,分别捕获格式错误、溢出错误、未知错误,兼容重试。
static void Main(string[] args)
{
inputNum: // 标签:用于出错后重试
try
{
Console.WriteLine("请输入合法数字");
string s = Console.ReadLine();
// 可能报错:格式错误 / 数值溢出
int num = int.Parse(s);
double sum = Math.Pow(10, num);
Console.WriteLine("计算结果:" + sum);
}
// 1. 精准捕获:格式错误
catch (FormatException ex)
{
Console.WriteLine("异常信息:" + ex.Message);
goto inputNum; // 回到开头重新输入
}
// 2. 精准捕获:数值超出int范围
catch (OverflowException ex)
{
Console.WriteLine("输入数字超出范围");
goto inputNum;
}
// 3. 兜底捕获:所有未知异常
catch (Exception ex)
{
Console.WriteLine("无法预料的异常");
throw ex; // 抛出异常,让程序终止
}
}
需求:输入索引读取数组值,越界报错后自动重试
static void Main(string[] args)
{
i1:
try
{
int a = int.Parse(Console.ReadLine());
int[] ss = new int[] { 1, 2, 3, 4 };
// 输入负数/大于3的索引会触发越界异常
Console.WriteLine(ss[a]);
}
// 精准捕获索引越界
catch (IndexOutOfRangeException ex)
{
Console.WriteLine(ex.Message + "++++++++");
goto i1; // 重试
}
// 兜底所有异常
catch (Exception)
{
throw; // 空throw:原样抛出捕获的异常
}
}
对象为null,直接调用成员触发异常
// 数组变量为空,没有实例化
int[] arr = null;
// 报错:空引用异常
Console.WriteLine(arr[0]);
Try包裹风险行,Catch分级抓异常;
精准异常写在前,基类Exception兜底防;
Message拿提示,Throw抛出崩或扛;
Goto跳转做重试,程序稳定不慌张。
从实现思路看,总的来说,C# try-catch 异常适合结合实际项目边做边理解。先抓住核心思路,再逐步补上细节和边界处理,最后效果会更稳定,也更容易复用。