【问题标题】:Attach stack trace to exception?将堆栈跟踪附加到异常?
【发布时间】:2017-04-24 09:28:24
【问题描述】:

众所周知,异常通常是不可序列化的,并且在对不同的 .NET 异常进行序列化/反序列化时在各种序列化程序中发现了一些非常奇怪的错误后,我想出了用于传输级别的简单 DTO:

[DataContract]
public class Error
{
    [DataMember]
    public string Message {get;set;}
    [DataMember]
    public string StackTrace {get;set;}
    //all Exception fields here
}

我可以成功地将 Exception 转换为 Error 类,但是如何做相反的事情呢?我的意思是,我想在实际运输之后将它扔掉,并带有有效的远程堆栈跟踪以及运输前的一切...... 一种方法是使用反射,但是,呃,它很糟糕而且看起来不健康。

【问题讨论】:

  • 为什么?异常已经包含调用栈并且可以被序列化。对ToString() 的简单调用将返回消息 堆栈跟踪。您提出的首先是异常的样子。
  • 嗯,很简单。它不是结构化的。因此很难在用户界面中将其分离,或者将其通过管道传输到 graylog 或某些日志聚合器中,您可以在其中构建日志以更好地理解错误。
  • 这将是一个严重的错误,因为 SOAP 已经有自己的故障协议。违反它,您的客户将无法沟通。此外,您不想将内部信息暴露给不受信任的客户端。这就是为什么将异常映射到不同的故障消息的标准做法
  • 您正在尝试做的事情已经不健康,因此使用反射不会受到伤害,就像在这个问题中一样:stackoverflow.com/q/37093261/5311735
  • 如果您不想反射 - 您可以使用默认的 .Net 序列化程序(二进制格式化程序)将异常序列化为字节数组,然后像这样传递它(作为 byte[] 属性)。然后你应该能够在客户端很好地反序列化它。是的,这也很丑陋,但是您再次尝试做的事情已经有争议了。

标签: c#


【解决方案1】:

好吧,我不完全理解这样做的要求,但在传输级通信中,总是有错误消息/代码传递的规定,例如 WCF 有 fault-contract 你可以检查。我在Serializable Exception 找到了可能适合您需要的答案。它具有三种实现方式和良好的代码。

【讨论】:

    猜你喜欢
    • 2011-01-05
    • 2017-08-06
    • 2010-09-13
    • 1970-01-01
    • 2022-01-09
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多