如果我将以下行添加到ASP.NET MVC操作方法
throw new Exception("outer", new SecurityException("inner"));
死亡黄色屏幕上实际显示的错误是内部SecurityException,绝对没有提到外部异常。
抛出:SecurityException
描述:应用程序尝试不执行操作 安全政策允许。授予此应用程序 必要的权限请联系您的系统管理员或更改 应用程序在配置文件中的信任级别。
异常详细信息:System.Security.SecurityException:inner
来源错误:
执行期间生成了未处理的异常 当前的网络请求。有关的来源和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。
堆栈追踪:
[SecurityException:inner]
这是预期的行为吗?
外部异常的类型似乎并不重要。即使它是另一个SecurityException,也不会显示该消息。默认的SecurityException错误消息是如此模糊,我想捕获它并添加一些更具体的信息。如果我不将原始的SecurityException包含为innerException,但是理想情况下我想这样做,这样可以正常工作。
答案 0 :(得分:5)
此行为源自ASP.NET“核心”,而不是ASP.NET MVC。不幸的是,错误格式化程序类是内部的,并且消费类型不提供任何扩展点,允许用户调整行为而不替换错误报告机制。解决方法是通过自定义错误页面/视图替换默认的“黄色死亡屏幕”页面,其中一个公开了一个人喜欢的信息。
这正是人们通常应该为生产做的事情。在您的情况下,它只是意味着您将有一个备用版本用于调试,而不是使用ASP.NET提供的默认值。
答案 1 :(得分:-1)
throw new SecurityException("user should not be allowed to access this method...");
在这样的情况下,您在日志或页面中缺少什么?
如果您使用应用程序全局异常处理程序并使用Log4Net
或NLog
从那里进行登录,则应该能够从外部到内部访问所有异常链,依此类推,具体取决于您的配置方式并使用日志框架。 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行