gpt4 book ai didi

.net - .NET 4.0 中的 Exception.ToString 损坏?

转载 作者:行者123 更新时间:2023-12-04 18:11:27 24 4
gpt4 key购买 nike

我正在使用一个使用 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(),而是一个私有(private)方法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() 被按预期调用,因此这是一个沿途某处的重大更改。

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

The default implementation of ToString obtains the name of the class that threw the current exception, the message, the result of calling ToString on the inner exception [...]



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

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

最佳答案

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

关于.net - .NET 4.0 中的 Exception.ToString 损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13304503/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com