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

时间:2012-02-16 11:16:16

标签: asp.net asp.net-mvc exception-handling code-access-security

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

throw new Exception("outer", new SecurityException("inner"));

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

  

抛出:SecurityException

     

描述:应用程序尝试不执行操作   安全政策允许。授予此应用程序   必要的权限请联系您的系统管理员或更改   应用程序在配置文件中的信任级别。

     

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

     

来源错误:

     

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

     

堆栈追踪:

     

[SecurityException:inner]

这是预期的行为吗?

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:-1)

通常,你不应该直接抛出Exception类/对象,而只抛出派生类,例如:

throw new SecurityException("user should not be allowed to access this method...");

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

如果您使用应用程序全局异常处理程序并使用Log4NetNLog从那里进行登录,则应该能够从外部到内部访问所有异常链,依此类推,具体取决于您的配置方式并使用日志框架。 IIS / ASP.NET的黄页可能不完整,但无论如何都应该显示堆栈跟踪。

如果你想从catch块中抛出自己的异常,你就用这种方式包装来自catch的实际异常:

throw new SecurityException("user should not be allowed...", exc);

修改:尝试了您的建议并通过Log4Net登录了以下文本文件:

  

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