C# 异常处理方法 C#如何使用try-catch捕获异常

来源:这里教程网 时间:2026-02-21 17:41:44 作者:

try-catch 最基本写法和执行逻辑

不加

catch
finally
try
是语法错误;
try
必须至少跟一个
catch
finally
。程序进入
try
块后,一旦某行抛出异常(比如
throw new InvalidOperationException()
),后续语句立刻停止执行,控制权跳转到匹配的
catch
块(按类型从上到下匹配),而不是继续往下跑。

try
{
    int x = 10 / 0; // 这里抛出 DivideByZeroException
    Console.WriteLine("这行不会执行");
}
catch (DivideByZeroException ex)
{
    Console.WriteLine($"捕获到除零异常:{ex.Message}");
}

多个 catch 块的顺序为什么不能乱

异常类型匹配是“就近且精确”,子类异常必须写在父类前面,否则编译报错

CS0160: A previous catch clause already catches all exceptions of this or a super type
。比如
NullReferenceException
继承自
SystemException
,若把
SystemException
放前面,后面所有具体异常类型都失效。

catch (ArgumentNullException)
→ 可以捕获
ArgumentNullException
实例
catch (ArgumentException)
→ 可以捕获
ArgumentNullException
ArgumentOutOfRangeException
但后者必须写在前者之后,否则前者永远不会被触发

何时用 catch (Exception) 和什么时候该避免

直接写

catch (Exception)
能捕获一切运行时异常,但会掩盖本该由上层处理或需要记录诊断信息的严重问题。它适合做兜底日志、UI 层统一错误提示,但绝不该用来“吞掉异常”后静默继续。

✅ 合理场景:WPF 窗口事件处理器中记录日志并弹提示框 ❌ 危险操作:在数据访问层捕获
Exception
后只写
Console.WriteLine("出错了")
就返回默认值
⚠️ 注意:
catch (Exception ex)
不捕获
StackOverflowException
OutOfMemoryException
等底层异常(.NET Core+ 默认不传播)

finally 里的代码一定会执行吗

绝大多数情况下会执行,包括

return
提前退出、
catch
中再次抛异常、甚至
try
Environment.Exit()
之外的所有正常流程。但它无法拦截进程被强制终止(如任务管理器杀进程)、断电、或调用
Environment.FailFast()

try
{
    return "from try";
}
catch
{
    return "from catch";
}
finally
{
    Console.WriteLine("finally 总会打印"); // 这行会输出
}

复杂点在于:如果

try
catch
都有
return
finally
仍会执行,但它的代码不能改变已确定的返回值(除非是引用类型内部修改)。

相关推荐