我在做 ASP.NET 网站的异常捕获程序时发现了一个坑:从 .aspx 页面里抛出的 HttpException 类型异常无法直接获取到其开发者自定义的 Message 参数值。
假如站点中有个 .aspx 页面,我们使其在页面载入时抛出一个 HttpException 异常并自定义一串错误消息:
protected void Page_Load(object sender, EventArgs e)
{
throw new HttpException(500, "自定义错误消息");
}
然后在 Global.asax 处理程序的异常事件中获取此异常:
protected void Application_Error(object sender, EventArgs e)
{
Exception last_error = Server.GetLastError();
}
你会发现 last_error 异常的 Message 参数值不符合预期,你自定义的错误消息跑到了 InnerException 里面,如下调试图:

这个问题费了我一些时间,因为我发现在网站项目的 URL 路由程序中用的是同样的代码,但是全局处理程序的异常事件是能够对此进行正常操作的,而不是出现在了 InnerException 里面,所以我猜测 ASP.NET 框架或者是其它方面对 .aspx 页面的异常处理做出了额外的封装修改。
相关环境:.NET Framework 4.8