【问题标题】:Exception.ToString broken in .NET 4.0?.NET 4.0 中的 Exception.ToString 损坏?
【发布时间】:2012-11-09 08:24:46
【问题描述】:

我正在使用一个使用 Exception.ToString() 报告异常的测试框架。

昨天我遇到了关于嵌套异常的不完整报告,在使用 Reflector 进行一些工作后得出的结论是 .NET 4.0 破坏了内部异常字符串表示的组成方式。

这是一个例子;

public class MyException : Exception
{
  DateTime when;

  public MyException(DateTime when)
  {
    this.when = when;
  }

  public override string ToString()
  {
    var builder = new StringBuilder();
    builder.AppendFormat("Happened at: {0}\r\n", this.when);
    builder.Append(base.ToString());
    return builder.ToString();
  }
}

class Program
{
  private static void throws()
  {
    throw new Exception("bobby!", new MyException(DateTime.Now));
  }

  private static void catches()
  {
    try
    {
      throws();
    }
    catch (Exception e)
    {
      Console.WriteLine(e);
    }
  }

  static void Main(string[] args)
  {
    catches();
  }
}

这里的控制台输出将不包含我自定义的“发生在”前缀。

请注意,如果我们直接抛出 MyException,而不是嵌套在另一个异常中,则会使用自定义字符串 rep。

原来原因是Exception.ToString()不再调用内部异常的ToString(),而是一个私有方法ToString(bool),即

// Exception
public override string ToString()
{
  return this.ToString(true);
}

private string ToString(bool needFileLineInfo)
{
  // yada yada

  if (this._innerException != null)
  {
    result += "some stuff " + this._innerException.ToString(needFileLineInfo) + " some more stuff";
                                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^
  }

  // yada yada

  return result;
}

因此,由于 Exception.ToString() 不再调用内部异常的 ToString(),因此该实现使内部异常的自定义字符串表示的任何机会都短路了。

在 .NET 2.0 中,可覆盖的 ToString() 被按预期调用,因此这是一个重大变化。

文档没有改变,并且仍然声称;

ToString的默认实现获取类名 抛出当前异常,消息,调用结果 内部异常上的 ToString [...]

http://msdn.microsoft.com/en-us/library/system.exception.tostring.aspx

这对除了我以外的任何人来说都是一个错误吗?

【问题讨论】:

  • 不能解决你的问题总线小注意,你不应该从异常派生你的类,派生自:ApplicationException。 - blog.gurock.com/articles/creating-custom-exceptions-in-dotnet
  • 谢谢!更改示例以免分散其他人的注意力:-)
  • 关于ApplicationException 与Exception,指导原则是不使用ApplicationException。参考:stackoverflow.com/a/52770/66849
  • @DavidePiras 该帖子似乎没有时间戳,但正如 PHeiberg 指出的那样,它给出了非常过时的建议。请注意,this blogs.msdn 的帖子从 2006 年开始 说“该指南是几年前修订的”...
  • 哦,好的。回滚。谢谢,伙计们。

标签: .net exception


【解决方案1】:

是的,这似乎是一个错误。看看MS Connect issue。

【讨论】:

  • 谢谢!昨天我在搜索 Connect 时花了很多时间,但找不到任何相关内容。现在我会屏住呼吸,直到下一个主要版本出来:-)
  • 顺便问一下,有没有人可以在 .NET 4.5 环境上进行检查?该问题已于 2010 年 9 月关闭,因此感觉应该已将其纳入 4.5...谢谢!
  • 不幸的是,这在 .NET 4.5 中没有修复。您也可以从referencesource.microsoft.com/netframework.aspx 下载源代码并自行检查。所以如果你真的打算屏住呼吸..很高兴认识你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多