Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Exception.ToString在.NET 4.0中被破坏?_.net_Exception - Fatal编程技术网

Exception.ToString在.NET 4.0中被破坏?

Exception.ToString在.NET 4.0中被破坏?,.net,exception,.net,Exception,我使用的测试框架使用Exception.ToString()报告异常 昨天我遇到了嵌套异常的不完整报告,在使用Reflector进行了一些工作后得出结论,.NET4.0破坏了内部异常字符串表示的组成方式 这里有一个例子 public class MyException : Exception { DateTime when; public MyException(DateTime when) { this.when = when; } public overrid

我使用的测试框架使用Exception.ToString()报告异常

昨天我遇到了嵌套异常的不完整报告,在使用Reflector进行了一些工作后得出结论,.NET4.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.ToString()不再调用内部异常的ToString(),因此该实现缩短了为内部异常定制字符串表示的任何机会

在.NET2.0中,可重写的ToString()按预期调用,因此这是一个突破性的变化

文件没有改变,仍然声称

ToString的默认实现获取类的名称 引发当前异常、消息和调用的结果 ToString在内部异常上[…]


除了我之外,这听起来像是一个bug吗?

是的,似乎是个bug。看看。

并不能解决您的问题。请注意,您不应该从Exception派生类,派生自:ApplicationException。-谢谢更改示例以避免分散其他人的注意力:-)关于
ApplicationException
vs
Exception
,指南是不要使用
ApplicationException
。参考资料:@DavidePiras,这篇文章似乎没有时间戳,但正如PHeiberg指出的,它给出了非常过时的建议。请注意,blogs.msdn在2006年发布的帖子中说,“该指南在几年前修订过”…哦,好的。向后滚。谢谢,伙计们,谢谢你们!我昨天花了很长时间搜索Connect,但找不到任何相关内容。现在,我将屏住呼吸,直到下一个主要版本发布:-)顺便问一下,有没有人有一个.NET4.5环境,他们可以检查这个?该期已于2010年9月结束,所以感觉应该是4.5版。。。谢谢不幸的是,这在.NET4.5中并没有固定下来。您还可以从下载源代码并自行检查。所以如果你真的想屏住呼吸……很高兴认识你:)
// 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;
}