Exception.ToString在.NET 4.0中被破坏?
我使用的测试框架使用Exception.ToString()报告异常 昨天我遇到了嵌套异常的不完整报告,在使用Reflector进行了一些工作后得出结论,.NET4.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
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
vsException
,指南是不要使用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;
}