连接数据库时是否使用关键字catch或处理C#中的异常?或者我应该在使用中的所有数据库方法中使用try catch块?使用try catch是否会创建不必要的代码?
using (var db = new ApplicationContext())
{
try {
/* Query something */
} catch(Exception e) {
logger.Debug(e);
}
}
Run Code Online (Sandbox Code Playgroud)
该using块不会为您"处理"异常,它只会确保Dispose()在IDisposable对象(在本例中为您的db实例)上调用该方法,即使在发生异常时也是如此.所以,是的,你需要try-catch在需要的地方添加块.
也就是说,一般来说,你只想捕捉异常,你可以用它们实际做一些有意义的事情.如果您只需要记录异常,请考虑在调用堆栈中较高位置的单个位置执行异常处理,这样您就不必try-catch在整个地方乱丢代码.
您可以在此处阅读有关使用Statement的信息,以了解它实际上做了什么以及如何翻译.
编辑:
如果,无论出于何种原因,你选择保持你的try-catch位置,至少,确保重新抛出异常,而不是吞下它,这就像扫地毯下的混乱,假装一切都很好.此外,请务必重新抛出它而不会丢失宝贵的堆栈跟踪.像这样:
using (var db = new ApplicationContext())
{
try {
/* Query something */
} catch(Exception e) {
logger.Debug(e);
throw; // rethrows the exception without losing the stack trace.
}
}
Run Code Online (Sandbox Code Playgroud)
编辑2:Eric Lippert关于异常处理的非常好的博客文章.
连接数据库时是否使用关键字catch或处理C#中的异常?
A using在逻辑上等同于a try-finally,所以是的,它处理异常,但它不会停止异常.A finally传播异常.
我应该在使用中的所有数据库方法中使用try catch块吗?
不.在try-catch应该去外面了using.这样它将保护资源创造.
使用try catch是否会创建不必要的代码?
我不知道这个问题意味着什么.
你没有问过的一些问题:
我应该捕获所有日志记录的异常,然后重新抛出它们吗?
不.只捕捉并吃掉你知道如何处理的异常.如果要记录异常,则在完成日志记录后重新抛出异常; 其他代码可能想要处理它们.
编写此代码的正确方法是什么?
分开你的顾虑.你有三个问题:
每个都应该由一个单独的声明处理:
try // handle exogenous exceptions
{
try // log all exceptions
{
using(var foo = new Foo()) // dispose the resource
{
foo.Bar();
}
}
catch(Exception x)
{
// All exceptions are logged and re-thrown.
Log(x);
throw;
}
}
catch(FooException x)
{
// FooException is caught and handled
}
Run Code Online (Sandbox Code Playgroud)
如果您的目标是仅记录未处理的异常,则反转两个处理程序的嵌套,或使用其他机制,例如appdomain的未处理异常事件处理程序.
| 归档时间: |
|
| 查看次数: |
1126 次 |
| 最近记录: |