gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:55:24 26 4
gpt4 key购买 nike

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


虽然我的问题很笼统,但我目前的情况是这样的:

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

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

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

最佳答案

Is it ok to let exception bubble up instead of catching it in every method?

不要在每个方法中都捕获异常! - 你应该捕获异常,如果你可以用它做一些有用的事情,例如:

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

我维护过的应用程序中,每个方法都被 try-catch block 包围,我的字面意思是每个方法:

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

像这样捕获异常是完全没有意义的,除了让你的代码更难阅读和你的异常更难跟踪之外什么也做不了。

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

然而,在许多情况下,有一种专门为此目的而设计的替代机制 - WCF 具有 IErrorHandler可以注册接口(interface)以一致的方式捕获和记录所有未处理的异常,而无需在每个公开的方法中使用 try-catch block 。

关于c# - 将异常冒泡到堆栈顶部是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5865096/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com