C# 异常的结果。ToString()在不同的项目中是不同的
当我在测试控制台应用程序中创建嵌套异常时,我得到以下结果:C# 异常的结果。ToString()在不同的项目中是不同的,c#,exception,formatting,C#,Exception,Formatting,当我在测试控制台应用程序中创建嵌套异常时,我得到以下结果: class Program { static void Main(string[] args) { var innerException = new SomeException("Inner Error"); var outerException = new Exception("Outer Error", innerException); var outerExcepti
class Program
{
static void Main(string[] args)
{
var innerException = new SomeException("Inner Error");
var outerException = new Exception("Outer Error", innerException);
var outerExceptionString = outerException.ToString();
Console.WriteLine(outerExceptionString);
Console.ReadKey();
}
}
public class SomeException : Exception
{
public SomeException(string message) : base(message) { }
public SomeException(string message, Exception innerException) : base(message, innerException) { }
public override string ToString()
{
return "BLABLABLA";
}
}
输出:
System.Exception: Outer Error ---> BLABLABLA
--- End of inner exception stack trace ---
System.Exception: Outer Error ---> TestUtility.SomeException: Inner Error
--- End of inner exception stack trace ---
输出包含重写的字符串“blabla”。但是,如果我现在将此代码复制到windows应用程序中,则会得到不同的结果:
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
var innerException = new SomeException("Inner Error");
var outerException = new Exception("Outer Error", innerException);
var outerExceptionString = outerException.ToString();
MessageBox.Show(outerExceptionString);
// ... lots of other code
}
public class SomeException : Exception
{
public SomeException(string message) : base(message) { }
public SomeException(string message, Exception innerException) : base(message, innerException) { }
public override string ToString()
{
return "BLABLABLA";
}
}
正如您所看到的,出于某种原因,它没有包含重写的字符串“blabla”。我尝试在其他windows应用程序中测试它,但结果与console应用程序中相同。出于某种原因,我在一个特定的项目中得到了不同的行为。是否存在任何可能影响异常格式化方式的内容?所有应用程序都使用.net framework 3.5。是否可能是您意外地从不同的命名空间实例化了一个类
SomeException
?您的输出表明完全引用的类型是TestUtility.SomeException
要测试这一点,请在实例化
innerException
时使用一个完全限定的命名空间,看看它是如何为您工作的。我发现了问题。尽管我使用的是相同的3.5.net框架,但在运行时,我的项目指向不同版本的mscorlib.dll(出于某种原因)。mscorlib 2.0版本中的Exception.cs使用重写字符串生成输出,而在mscorlib 4.0中,代码似乎有所不同
以下是mscorlib 2.0版中的Exception.ToString()方法:
public override String ToString() {
String message = Message;
String s;
if (_className==null) {
_className = GetClassName();
}
if (message == null || message.Length <= 0) {
s = _className;
}
else {
s = _className + ": " + message;
}
if (_innerException!=null) {
s = s + " ---> " + _innerException.ToString() + Environment.NewLine + " " + Environment.GetResourceString("Exception_EndOfInnerExceptionStack");
}
if (StackTrace != null)
s += Environment.NewLine + StackTrace;
return s;
}
public重写字符串ToString(){
字符串消息=消息;
字符串s;
如果(_className==null){
_className=GetClassName();
}
如果(message==null | | message.Length我确信我使用了正确的异常类型。我尝试指定名称空间,但得到了相同的结果。此外,如果我在Visual Studio中进行声明,我会找到正确的类型。在我的应用程序中没有其他具有相同名称的异常类型。这很奇怪。这非常奇怪。我会尝试放置一个breakpoi您的重写ToString()中的nt实现来查看它是否被调用。这并不能解决您的问题,但至少可以确认一些怀疑。您还可以在SomeException的构造函数中放置一个断点,以双重确保它是被实例化的。感谢您的帮助,我想我找到了为什么它不包含重写的字符串。看起来Exception.cs在mscorlib.dll 2.0和4.0中的实现是不同的。我在不同的项目中链接到不同的dll,尽管我在项目属性中设置了相同的3.5框架。
public override string ToString()
{
return this.ToString(true, true);
}
private string ToString(bool needFileLineInfo, bool needMessage)
{
string text = needMessage ? this.Message : null;
string text2;
if (text == null || text.Length <= 0)
{
text2 = this.GetClassName();
}
else
{
text2 = this.GetClassName() + ": " + text;
}
if (this._innerException != null)
{
text2 = string.Concat(new string[]
{
text2,
" ---> ",
this._innerException.ToString(needFileLineInfo, needMessage),
Environment.NewLine,
" ",
Environment.GetRuntimeResourceString("Exception_EndOfInnerExceptionStack")
});
}
string stackTrace = this.GetStackTrace(needFileLineInfo);
if (stackTrace != null)
{
text2 = text2 + Environment.NewLine + stackTrace;
}
return text2;
}