抛出新的异常没有被Server.GetLastError()

时间:2017-05-25 01:29:10

标签: c# asp.net

在我的控制器操作中,我正在捕获异常并在冒泡到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();
}

2 个答案:

答案 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