删除过多的try-catch块

hen*_*iny 9 c# exception-handling try-catch winforms

我正在重构由其他开发人员编写的中型WinForms应用程序,并且几乎每个类的每个方法都被一个try-catch块包围.99%的时间这些catch只阻止记录异常或清理资源并返回错误状态.

我认为很明显,这个应用程序缺乏适当的异常处理机制,我打算删除大多数try-catch块.

这样做有什么不利之处吗?你会怎么做?我打算:

  • 要适当地记录异常并阻止它们传播给用户,请拥有一个Application.ThreadException处理程序

  • 对于需要清理资源的情况,请保留try-catch块

更新:使用usingtry-finally阻止是一种更好的方法.谢谢你的回复.

  • 在"return-false-on-error"的方法中,让异常传播并在调用者中捕获它

欢迎任何更正/建议.

编辑:在第3项中,"return-false-on-error"我的意思是这样的方法:

bool MethodThatDoesSomething() {
    try {
       DoSomething(); // might throw IOException
    } catch(Exception e) {
       return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想把它重写为:

void MethodThatDoesSomething() {
   DoSomething(); // might throw IOException
}

// try-catch in the caller instead of checking MethodThatDoesSomething's return value
try {
   MethodThatDoesSomething()
} catch(IOException e) {
   HandleException(e);
}
Run Code Online (Sandbox Code Playgroud)

C.E*_*uis 2

“要正确记录异常并防止它们传播给用户,请使用 Application.ThreadException 处理程序”

然后你能告诉用户发生了什么吗?所有例外都会在那里结束吗?

“对于需要清理资源的情况,请保持 try-catch 块不变”

try-finally如果您希望让异常在其他地方处理,您也可以使用块。using还可以考虑在资源上使用关键字IDisposable

“在“错误时返回 false”的方法中,让异常传播并在调用者中捕获它”

这取决于方法。例外只应在特殊情况下发生。AFileNotFoundException对于抛出的方法来说很奇怪FileExists(),但通过 抛出却完全合法OpenFile()