为什么控制台应用中using块内自定义的Dispose方法未被触发?
问题解答
核心原因
这不是你的代码逻辑错误,是控制台程序的默认异常处理机制和Web应用存在差异导致的:
- using语句本质是
try { 代码块 } finally { 资源.Dispose() }的语法糖,正常逻辑下只要进程未被强制终止,finally块的代码一定会执行。 - Web应用内置了全局异常捕获管道,请求处理过程中抛出的未处理异常会被框架捕获,不会导致整个服务进程终止,因此Dispose方法会被正常调用。
- 控制台程序没有内置全局异常捕获逻辑,你示例中的代码没有对全局异常做捕获,
ExecuteReader抛出的异常属于未处理异常,默认会直接触发进程强制终止,运行时会跳过剩余的finally块执行,或执行时调试器已分离,因此你看不到断点命中。
验证方案
给Main方法增加全局异常捕获,避免进程直接终止,即可命中Dispose断点:
static void Main(string[] args) { try { test(); } catch (Exception ex) { // 捕获异常避免进程直接退出 Console.WriteLine($"抛出异常:{ex.Message}"); } }
额外注意点
你贴出的CommonSqlObject类存在语法错误:Dispose方法结束后多写了一个闭合大括号,实际开发时需要删除多余括号避免编译失败。
内容的提问来源于stack exchange,提问作者daxu
相关产品推荐
相关产品推荐

