【问题标题】:Change type of exception while preserving the stack trace在保留堆栈跟踪的同时更改异常类型
【发布时间】:2017-05-09 15:40:57
【问题描述】:

我有一个与 WebApi 通信的 WCF 服务。当我的 WCF 抛出自定义异常时,例如 AutoMapperMappingException,当它将异常序列化回 WebApi 时,我得到一个 ReadFault,因为 WebApi 没有安装 Automapper。

现在这是一个普遍的问题,任何第三方库都可能发生,所以我不想在 WebApi 上安装第三方库。

有没有一种方法可以在保留堆栈跟踪的同时更改异常的类型。

我想做这样的事情(每个异常都需要它自己的自定义实现,但这没关系):

public void ThrowKnownException(AutoMapperMappingException ex)
{
    var message = FormatMessage(ex);

    var knownException = new Exception(message);
    knownExcpetion.StackTrace = ex.StackTrace;

    throw knownException;
}

这不起作用,因为您无法分配 StackTrace。有谁知道这样做的干净方法?

编辑: 添加内部异常将不起作用,因为 WCF 仍需要将内部异常序列化到 webapi,这将创建读取错误

【问题讨论】:

  • 您是否反对仅将其添加为内部异常?
  • @Lithium 是的,添加内部异常不起作用,因为内部异常也需要序列化回来

标签: c# wcf asp.net-web-api exception-handling stack-trace


【解决方案1】:

您可以使用重载的构造函数将异常包装为 InnerException

Exception Overload

【讨论】:

  • 这不起作用,内部异常也被序列化,这将创建一个 readfault
  • 在我看来,出于安全考虑,您永远不应该在 WCF 响应中返回异常堆栈。在任何生产服务中,不建议抛出显示堆栈的异常。
  • 同意,我们的 WebApi 上有一种机制,可以从异常中过滤用户所见内容的权限。这只能由某些用户在内部看到
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 2011-01-05
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
相关资源
最近更新 更多