C#中的异常传播

chu*_*lor 3 c# exception-handling

假设我在C#程序中有三个函数doA(),doB()和doC(),我知道doA()将调用doB(),而doB()又调用doC().

由于doC()必须与数据库进行交互,因此我知道它可以很好地生成无法解决的异常,需要引起用户的注意.目前,我有一些代码可能会在doC()中的try/catch打击中抛出错误,然后在另一个try/catch中调用doB()中的doC(),同样在doA中调用doB() ()在try/catch块中.这允许我只使用throw; 将异常踢到doA(),在那里可以合理地将某些内容显示给用户.

这看起来有点像矫枉过正.我想知道是否因为我不打算在doB()或doC()中处理异常,如果我可以摆脱那里的try/catch块.

假设没有涉及最终块,处理这种情况的最佳做法是什么?

Jon*_*eet 10

如果你的catch块是这样的:

catch (Exception)
{
    throw;
}
Run Code Online (Sandbox Code Playgroud)

然后他们确实毫无意义.你并没有真正处理异常 - 根本不用try/catch.

就个人而言,我的代码中只有很少的try/catch块 - 虽然有很多隐式的 try/finally块,但大多数是由using语句引起的.


Mar*_*ers 5

是的,我会摆脱try/catch块 - 只是让异常传播到顶层,然后在那里捕获它.捕获异常只是为了重新抛出throw;是没有用的,尽管下面的变化实际上是有害的,因为它会破坏堆栈跟踪信息:

catch (Exception exception)
{
    throw exception;
}
Run Code Online (Sandbox Code Playgroud)


Lou*_*nco 5

如果您打算做某事(或者试图阻止传播),您只需要抓住.如果你没有捕获,它会进入调用者的捕获.在你的情况下,似乎doA()(或可能是它的调用者,取决于你可以处理它的位置)是唯一需要try/catch的函数.