C#中try-catch-finally的执行顺序 - 异常处理的完整指南

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

当代码中发生异常时,

try-catch-finally
的执行顺序是固定的,且
finally
块几乎总会在离开当前 try/catch 结构前执行——无论是否抛出异常、是否被 catch 捕获、甚至在 catch 中再次抛出异常或 return 语句出现时。

正常无异常时的执行顺序

如果

try
块内代码全部顺利执行,没有抛出任何异常:

先执行
try
中所有语句
跳过所有
catch
块(不进入)
执行
finally

有异常且被 catch 捕获时

try
中某行抛出异常,且存在匹配的
catch
块:

立即中断
try
中后续代码(不再执行)
跳转到对应
catch
块,执行其中语句
执行
finally
块(即使
catch
中有
return

catch 中再次抛出异常或 return 时

finally
仍会执行,且优先级高于
catch
中的
return
throw

catch
中写
return 42;
,会先暂存返回值,再进
finally
finally
执行完后,才真正返回(除非
finally
自己也
return
或抛异常)
finally
中抛出新异常,则覆盖原异常,调用栈中只体现 finally 的异常

finally 的关键特性与使用建议

finally
是释放资源最可靠的位置,比如关闭文件、释放数据库连接、解锁等:

它不依赖异常是否发生,也不依赖你有没有写
catch
可以单独和
try
配合使用(即
try-finally
),适合无需处理异常、只需确保清理的场景
避免在
finally
中写
return
,否则会吞掉
try
catch
的返回值或异常
.NET 6+ 推荐优先使用
using
语句或
IDisposable
模式,它们底层也依赖类似 finally 的机制

基本上就这些。掌握这个顺序,能帮你写出更健壮、不易泄露资源的异常处理逻辑。

相关推荐