使用内部SecurityException抛出异常仅在ASP.NET MVC中显示内部异常

Pau*_*les 6 asp.net asp.net-mvc exception-handling code-access-security

如果我将以下行添加到ASP.NET MVC操作方法

throw new Exception("outer", new SecurityException("inner"));
Run Code Online (Sandbox Code Playgroud)

实际显示在死亡黄色屏幕上的错误是内部SecurityException,绝对没有提到外部异常.

抛出:SecurityException

说明:应用程序尝试执行安全策略不允许的操作.要授予此应用程序所需的权限,请与您的系统管理员联系或在配置文件中更改应用程序的信任级别.

异常详细信息:System.Security.SecurityException:inner

来源错误:

在执行当前Web请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息.

堆栈跟踪:

[SecurityException:inner]

这是预期的行为吗?

外部异常的类型似乎并不重要.即使它是另一个SecurityException,也不会显示该消息.默认的SecurityException错误消息是如此模糊,我想捕获它并添加一些更具体的信息.如果我不包含原始的SecurityException作为innerException,但是理想情况下我想这样做,这样可以正常工作.

Nic*_*oiu 5

此行为源自ASP.NET"核心",而不是ASP.NET MVC.不幸的是,错误格式化程序类是内部的,并且消费类型不提供任何扩展点,允许用户调整行为而不替换错误报告机制.解决方法是通过自定义错误页面/视图替换默认的"黄色死亡屏幕"页面,其中一个公开了一个人喜欢的信息.

这正是人们通常应该为生产做的事情.在您的情况下,它只是意味着您将有一个备用版本用于调试,而不是使用ASP.NET提供的默认值.


Dav*_*ras -1

一般来说,你不应该直接抛出异常类/对象,而只能抛出派生类/对象,例如:

throw new SecurityException("user should not be allowed to access this method...");
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您在日志或页面中缺少什么?

如果您使用应用程序全局异常处理程序并使用其中之一进行日志记录,Log4Net或者NLog您应该能够访问从外部到内部的所有异常链,依此类推,具体取决于您如何配置和使用日志记录框架。IIS / ASP.NET 的黄页可能不完整,但无论如何应该显示堆栈跟踪。

如果您想从 catch 块中抛出自己的异常,则可以通过以下方式包装来自 catch 的实际异常:

throw new SecurityException("user should not be allowed...", exc);
Run Code Online (Sandbox Code Playgroud)

编辑:尝试了您的建议,并通过 Log4Net 将以下内容记录在文本文件中:

System.Security.SecurityException:更明确的异常---> System.Security.SecurityException: C:\DEV_RPP\Program.cs 中 EDICheckerApp.Program.boom() 处的原始异常 :第 45 行
--- 内部异常堆栈跟踪结束--- 在 C:\DEV_RPP\Program.cs 中的 EDICheckerApp.Program.boom():第 49
行 在 C:\DEV_RPP\Program.cs 中的 EDICheckerApp.Program.Main(String[] args):第 27 行