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

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


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

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

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

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

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

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

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

我保留了应用程序,其中每个nethod都包含一个try-catch块,我的意思是每个方法:

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

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

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

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

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

更新

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

你有时看到的是什么

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

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

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

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