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

时间:2011-05-03 04:42:11

标签: c# .net wcf exception-handling

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


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

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

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

但是,作为一种解决方法,我想只从OperationContract抛出异常,让异常冒泡到{{1}}。

3 个答案:

答案 0 :(得分:15)

  

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

不要捕获每种方法中的删除! - 如果你能用它做一些有用的事情,你应该才能捕获异常,例如:

  • 处理它(即不再重新抛出)
  • 添加一些重要的背景信息

我维护了应用程序,其中每个nethod都被try-catch块包围,我的意思是每个方法:

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

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

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

然而,在许多情况下,存在为此目的而设计的备用机制--WCF具有IErrorHandler接口,可以注册以一致的方式捕获和记录所有未处理的异常,而无需使用try-catch块每种暴露的方法。

答案 1 :(得分:7)

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

<强>更新

在回答您的问题时,不会,所有细节(包括引发异常的堆栈跟踪)都会与异常对象一起传播。

highLevelFunction(){
   try {
     lowerLevelFunction();
   } catch (LowLevelException e){
     throw HighLevelException(e);
   }
}

异常链接。那里发生的是你有一些低级异常,如“除以零”;你抓住它并引发一个新的异常,如“数据异常”,使其对调用highLevelFunction的例程更有意义。

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

答案 2 :(得分:2)

如果您有完整的应用程序(GUI,业务,数据),请将其冒泡到UI并在此处处理事件。这使您有机会同时向用户显示消息。它还将其捕捉到动作起点(即当用户执行动作X时发生这种情况)。在每种方法中捕获它都是CPU密集型且不必要的,因为您只需记录堆栈跟踪以找到原点。如果您正在制作中间件应用程序,那么尝试在界面上处理它或将其冒泡 - 取决于中间件的使用方式。