c# - 在我看来,在 ASP.NET MVC 中什么是最好的显示未处理的异常?

标签 c# asp.net-mvc asp.net-mvc-4 asp.net-mvc-5 unhandled-exception

我的 web.config 中有以下内容:

 <customErrors mode="On" defaultRedirect="Error">
  <error statusCode="404" redirect="Error/NotFound" />
</customErrors>

我有一个

 [HandleError]

在我的 HomeController 类的顶部。为了进行测试,我创建了一个简单地抛出异常的操作。 .它重定向到我的

 ErrorController/Index

方法,但是当它到达我的绑定(bind)到 HandleErrorInfo 的 View 时,我的模型为空,所以我以某种方式丢失了对错误的引用。

我确信它与重定向中丢失的错误有关,所以我想看看我是否遗漏了什么,以及是否有人建议我可以在其中查看显示 Stacktrace 和错误消息的 View 。

最佳答案

我可以看出误解。您想要执行 MVC 操作并重定向 到 Controller 操作。

但是 defaultRedirect 本身是一个 Web Form 约定,因此受到限制。当你重定向到另一个 Controller 时,你将失去你的 HttpContext,从而失去你的 HandleErrorInfo 对象

您的 [HandleError] 属性需要一个 View 来将其错误消息定向到。按照上面的示例,我假设您的 ErrorController 有一个 Views/Error 文件夹,并且其中有一个 Index View 。如果你想让你的 Filter Context 发送一个 HandleErrorInfo 对象到那个 View ,

试试这个语法:

[HandleError(View="~/Views/Error/Index")]
Public class HomeController : Controller

但是日志记录呢?!?!?

我怀疑您的意图更多 不仅仅是向用户显示错误堆栈。事实上,我怀疑你根本没有这样的意图。我怀疑您的真正目的是记录您的错误(可能是到数据库)并向您的用户显示一些乏味的消息。

到目前为止我所解释的是“在我看来什么是显示未处理异常的最佳[方式]”。 [HandleError] 属性对此很有帮助。

但是当您想进入下一步(记录错误)时,您有几个选择:

1) Override your base controller's On Exception method ;创建您自己的 Controller 继承自 MVC Controller 类,但覆盖 On Exception 方法。这种方法可以与 [HandleError] 属性结合使用

2) Create a custom exception handler创建您自己的记录错误的异常处理程序。然后,您的异常处理程序可以调用选择的 View ,或者可以与 [HandleError(order=2)] 一起工作,因为过滤器属性可以采用顺序参数应用优先级。


Nitin Sawant 询问错误 View 是什么样的。

@model System.Web.Mvc.HandleErrorInfo
<h2>Exception details</h2>
<p> Controller: @Model.ControllerName </p>
<p> Action: @Model.ActionName </p>
<p> Exception: @Model.Exception </p>

关于c# - 在我看来,在 ASP.NET MVC 中什么是最好的显示未处理的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16312588/

相关文章:

asp.net - 使用 MVC 应用程序在现有 Azure 数据库上运行 CRUD 操作

JQuery Form Post 未将 FormCollection 发送到 MVC Controller

asp.net - 从 byte[] 返回文件下载

c# - 如果我在启动文件中添加中间件。那个时候在模型中没有得到请求

c# - ASP.NET MVC 结构。从 View 中调用 Controller

c# - Microsoft WCF 测试客户端错误

asp.net-mvc - Asp.net MVC TextArea

asp.net-mvc-4 - MVC4 中 View 引擎的选择?

c# - MVC 图表仅显示文本流

c# - 在 Visual Studio 中使用 Pocketsphinx 创建项目