C# 在catch()中抛出新异常
我试图捕获一个异常,向它添加信息,并为调用模块抛出一个新的(增强的)异常 例如:C# 在catch()中抛出新异常,c#,exception-handling,C#,Exception Handling,我试图捕获一个异常,向它添加信息,并为调用模块抛出一个新的(增强的)异常 例如: void CallingMethod() { try { doStuff(); } catch(Exception e) { Console.WriteLine(e.ToString()); } } void doStuff() {
void CallingMethod()
{
try
{
doStuff();
}
catch(Exception e)
{
Console.WriteLine(e.ToString());
}
}
void doStuff()
{
try
{
// do something here that may throw an error
}
catch(Exception e)
{
Exception e2 = new Exception("new added info", e);
throw e2;
}
finally()
{
// cleanup
}
}
但是,当错误发生并写入控制台时,它是原始错误,而不是包含字符串“new added info”的my new error
这是预期的吗?我应该如何抛出新的错误以被捕获?考虑以下程序:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace ConsoleApplication20
{
class Program
{
static void Main( string[] args )
{
DoSomething() ;
return ;
}
static void DoSomething()
{
try
{
DoSomethingThatFails() ;
}
catch( Exception e )
{
throw new InvalidOperationException( "This is the wrapper exception" , e ) ;
}
}
static int DoSomethingThatFails()
{
int x = 3 ;
int y = 0 ;
int z = x / y ; // can you say "divide by zero"?
return z ;
}
}
}
这是写入控制台的内容:
Unhandled Exception: System.InvalidOperationException: This is the wrapper exception ---> System.DivideByZeroException: Attempted to divide by zero.
at ConsoleApplication20.Program.DoSomethingThatFails() in ...\Program.cs:line 32
at ConsoleApplication20.Program.DoSomething() in ...\Program.cs:line 21
--- End of inner exception stack trace ---
at ConsoleApplication20.Program.DoSomething() in ...\Program.cs:line 25
at ConsoleApplication20.Program.Main(String[] args) in ...\Program.cs:line 14
您会注意到,第一行由外部异常及其消息(invalidooperationexception
和这是包装异常
),后面是箭头(-->
),后面是内部异常(除以零异常
和试图除以零。
)
接下来的两行是内部异常的堆栈跟踪,后跟一个标记以指示内部异常堆栈跟踪的结束。然后获得外部异常的堆栈跟踪
所有的信息都在那里,你只是看不到而已。无法重现这一点。。似乎是新异常,原始异常作为内部异常..我复制粘贴了您的代码,“添加了新信息”是输出到控制台的第一件事。什么是原始异常?我刚刚发现问题-finally()中的“cleanup”引发了另一个异常。一旦我纠正了这一点,我就得到了预期的行为-我的新e2反馈。这个问题似乎离题了,因为OP已经回答了它。我的情况实际上并不像你在这里预期的那样(请参阅我对这个问题的评论-我最后遇到了另一个错误()),但这个答案可能是原因,所以我接受了,谢谢