在代码的每个可能失败的部分使用try-catch
块。
根据需要使用try-catch-finally
块。
在每个catch
块中,按照自己的需求记录异常。我使用Nlog进行记录,建议查看该工具。
try{
}
catch(Exception e){
}
finally{
}
类似这样:
public bool SendUsersBirthdayEmailsAsync(){
try{
SendMail();
}
catch(Exception e){
LogException(e);
}
finally{
OptionalWork();
}
}
编辑:关于避免使用通用异常
您总是可以使用多个catch
块来为每种类型的异常定义不同的行为。当您知道可以预期哪种异常时,这非常有用。
例如:
public bool SendUsersBirthdayEmailsAsync(){
try{
SendMail();
}
catch (ThreadAbortException tae)
{
LogException(tae);
}
catch (ThreadInterruptedException tie)
{
LogException(tie);
}
catch(Exception e){
LogException(e);
}
finally{
OptionalWork();
}
}
EDIT 2: 异常处理的官方Microsoft指南请参考
这里。
使用
try/catch
块包围可能会生成异常并且您的代码可以从该异常中恢复的代码。在
catch
块中,始终将异常从最派生到最少派生进行排序。所有异常都派生自
Exception
。较派生的异常不会被先于基本异常类的
catch
子句处理。当您的代码无法从异常中恢复时,请不要捕获该异常。如有可能,请启用调用堆栈上更高层次的方法进行恢复。
清理使用
using
语句或
finally
块分配的资源。建议使用
using
语句在抛出异常时自动清理资源。使用
finally
块清理不实现
IDisposable
的资源。
finally
子句中的代码几乎总是在抛出异常时执行。
try { ... } catch { ... }
吗? - kseen