在我的控制器操作中,我正在捕获异常并在冒泡到Application_Error()方法之前添加一些额外的信息
ActionResult Index()
{
try
{
var i = 1 / 0;
}
catch(Exception e)
{
throw new Exception("My new Exception!", e)
}
}
private void Application_Error(object sender, EventArgs e)
{
// Breakpoint shows original error! Not my newly thrown one!
var exception = Server.GetLastError().GetBaseException();
}
答案 0 :(得分:5)
快速浏览Exception.GetBaseException Method的文档可以清除所有内容:
一系列异常由一组异常组成,例如链中的每个异常都是作为其
InnerException
属性中引用的异常的直接结果而抛出的。对于给定的链,可能只有一个例外是链中所有其他异常的根本原因。此异常称为基本异常,其InnerException
属性始终包含空引用。
您将原始Exception
设置为引发InnerException
的{{1}},因此原始Exception
是“基本例外”。
如果您想查看链中最新的Exception
,也许不应该致电GetBaseException
?
答案 1 :(得分:1)
您无需致电GetBaseException
,因为这会为您提供原始例外。就这样做:
var ex = Server.GetLastError();
var inner = ex.InnerException;
这是一个快速测试,看看GetBaseException
做了什么:
var ex = new Exception("1st");
var ex2 = new Exception("2nd", ex);
var ex3 = new Exception("3rd", ex2);
var exFinal = ex3.GetBaseException();
Console.WriteLine(exFinal.Message);
输出:1st