在C#数据库相关的类中使用和尝试catch?

Jon*_*nen 3 c# using

连接数据库时是否使用关键字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)

sst*_*tan 8

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关于异常处理的非常好的博客文章.


Eri*_*ert 8

连接数据库时是否使用关键字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的未处理异常事件处理程序.