将异常冒泡到堆栈顶部是否可以?

Lea*_*ner 10 .net c# wcf exception-handling

是不是可以让异常冒泡到堆栈顶部而不是在每个方法中捕获它?我们应该在任何情况下都这样做吗?.. 这种方法是否存在任何微妙的问题或副作用(例如,丢失异常细节,堆栈跟踪或内部异常细节等)?


虽然我的问题很笼统,但我目前的情况如下:

我正在将现有的WSE3 Web服务移动到WCF,因此y客户端是WSE3客户端.

我添加了一个行为,以便FaultException在WCF服务中发生时将通知客户端.当方法中有异常时OperationContract,我在客户端获得异​​常消息没有任何问题.但是每当它出现在OperationContracts 以外的方法中时,我都会以某种方式得到与安全相关的问题.我无法确定确切的原因.

但是,作为一种解决方法,我想OperationContract只从异常中抛出异常并让异常冒泡到OperationContract.

Jus*_*tin 15

是否可以让异常冒泡而不是在每种方法中捕获它?

不要在每种方法中抓住激活!- 如果你能用它做一些有用的东西,你应该捕获异常,例如:

  • 处理它(即不重新抛出)
  • 添加一些重要的上下文信息

我保留了应用程序,其中每个方法都用一个try-catch块环绕,我的字面意思是每个方法:

public void DoSomething()
{
    try
    {
        throw new NotImplementedException();
    }
    catch (Exception ex)
    {
        throw ExceptionHandler.CreateException(ex, "DoSomething");
    }
}
Run Code Online (Sandbox Code Playgroud)

捕获这样的异常是完全没有意义的,除了使您的代码更难以阅读以及您的异常难以追踪之外什么都不做.

在异常必须传递一些进程间边界(例如在WCF服务中)的情况下,然后在您的异常暴露给世界的位置,您可能希望首先捕获,记录然后以兼容的格式重新抛出异常IPC边界,以便您记录服务中的所有故障

但是,在许多情况下,还有一种替代机制就是为此目的而设计的--WCF具有IErrorHandler接口,可以注册该接口以一致的方式捕获和记录所有未处理的异常,而不需要在每个公开的方法中使用try-catch块.


Cha*_*tin 7

当然,这就是他们的目的.经验法则是捕捉异常,你可以做出明智的继续尝试.所以,如果你得到类似内存不足的东西,那就让它冒泡并终止程序; 如果你在迭代大量数据时得到除以零,那么抓住它可以继续下一个数据.

更新

在回答您的问题时,不会使用异常对象传播所有细节(包括引发异常的堆栈跟踪).

你有时看到的是什么

highLevelFunction(){
   try {
     lowerLevelFunction();
   } catch (LowLevelException e){
     throw HighLevelException(e);
   }
}
Run Code Online (Sandbox Code Playgroud)

或者例外链接.那里发生的是你有一些低级异常,如"除以零"; 你捕获它并引发一个新的异常,如"数据异常",使其对调用的例程更有意义highLevelFunction.

(PS原谅我,如果这不是完美的C#语法,我最近没写过多少.)