标签: handleerror

ASP.Net MVC 3 - HandleError属性中的顺序似乎向后工作?

问题:当我使用Order属性的HandleError属性时,首先应用最高订单号,而不是最低的第一个.

细节

我想设置我的控制器以这种方式处理异常:

  • 如果是异常的类型CustomException,请使用"CustomError"视图.
  • 否则,使用默认的"错误"视图.

使用默认的MVC项目模板,我完成了以下操作:

  • HandleErrorAttribute从全局过滤器中删除了.
  • 打开自定义错误web.config.

然后我将这些属性添加到HomeController类中:

[HandleError(ExceptionType = typeof(Exception), View = "Error")]
[HandleError(ExceptionType = typeof(CustomException), View = "CustomError")]
Run Code Online (Sandbox Code Playgroud)

这样可以正常工作 - 如果CustomException抛出a,则会显示"CustomError"视图; 如果Exception抛出a,则显示"错误"视图.

但是,我认为Order属性上的HandleError属性会使事情更明确.从MSDN页面:

整数值越大,过滤器的优先级越低.

由此,我认为以下代码将导致在所有情况下显示"错误"视图:

[HandleError(Order = 1, ExceptionType = typeof(Exception), View = "Error")]
[HandleError(Order = 2, ExceptionType = typeof(CustomException), View = "CustomError")]
Run Code Online (Sandbox Code Playgroud)

但这种情况并非如此; 这会导致与Order未指定属性时相同的行为.如果我交换了Orders,会导致显示"Error"视图,即使CustomException抛出了一个.

基本上,实际的订单优先级似乎与文档完全相反.我做错了什么或这是一个错误?

asp.net-mvc handleerror asp.net-mvc-3

5
推荐指数
1
解决办法
2783
查看次数

HandleErrorAttribute 派生类不捕获异常?

我有一个 ASP.NET MVC Web 应用程序,我正在尝试改进其错误处理功能。我阅读了 HandleErrorAttribute 基类,并希望将它与我的控制器类一起使用。但是,当我从使用该属性修饰的控制器类之一中的方法抛出测试异常时,不会触发派生类中的OnException覆盖。我看到的不是我的派生错误处理类的 OnException 方法被触发,而是 XML 格式的通用错误消息,并且在我的应用程序中的任何地方都找不到通用错误消息:

<Error>
    <Message>An error has occurred.</Message>
</Error>
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

请注意,我尝试将以下自定义错误元素添加到我的web.config文件中的system.web元素,如此 SO 帖子所示,但它没有帮助

ASP.net MVC [HandleError] 没有捕获异常

<customErrors mode="On" defaultRedirect="Error" />
Run Code Online (Sandbox Code Playgroud)

这是我的 HandleErrorAttribute 派生类:

public class HandleControllerErrors : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        // Breakpoint set here never hit.

        Exception ex = filterContext.Exception;
        filterContext.ExceptionHandled = true;
        var model = new HandleErrorInfo(filterContext.Exception, "Controller", "Action");

        filterContext.Result = new ViewResult() …
Run Code Online (Sandbox Code Playgroud)

c# custom-attributes handleerror asp.net-web-api

5
推荐指数
1
解决办法
3384
查看次数

MVC HandleError返回错误500并查看错误页面

我正在使用VSC10的MVC 3并试图让[HandleError]工作.我在控制器中创建了一个测试来模拟崩溃,如下所示:

[HandleError]
public ActionResult Crash()
{
    throw new ApplicationException();
}
Run Code Online (Sandbox Code Playgroud)

还进入了web.config并添加了:

<customErrors mode="on" />
Run Code Online (Sandbox Code Playgroud)

如果我从Chrome运行,MVC将返回Shared/Error.aspx中的视图,因此这项工作正常.

如果我从IE 8运行,我得到它友好的错误页面("网站无法显示页面,最有可能的原因:......你可以尝试......").我进入IE工具并关闭"显示友好的HTTP错误消息"并再次运行,IE显示我的Error.aspx视图.显然我无法让用户更改此设置,但至少我知道我的Error.aspx正在返回.

所以我运行Fiddler,当我使浏览器转到我的Crash方法时,它显示即使MVC返回我的Error.aspx视图,它也会返回500结果.这会导致IE认为它有错误并使用友好页面覆盖我的页面.

我认为MVC应该返回结果200与我的Error.aspx页面而不是500.任何人都可以给我一些关于尝试什么的想法?

asp.net-mvc handleerror

3
推荐指数
1
解决办法
2856
查看次数

RegisterGlobalFilters和HandleErrorAttribute不起作用

在与RegisterGlobalFilters和HandleErrorAttribute永远斗争之后,我决定回到原点.我使用模板在VS10中创建了一个新的MVC 3项目.在About-action中添加一个抛出DivideByZeroException并启动dev服务器.预计不会看到黄色的屏幕.

但我做到了.

为什么这对我不起作用?

更新

archil和Adam Tuliper的建议有点奏效.调用了Error视图.

然后我继续在RegisterGlobalFilters中添加它.

filters.Add(new HandleErrorAttribute { ExceptionType = typeof(DivideByZeroException), View = "DivideByZeroException", Order = 1 });
filters.Add(new HandleErrorAttribute { View = "AllOtherExceptions", Order = 2 });
Run Code Online (Sandbox Code Playgroud)

调用了AllOtherExceptions视图.为什么不是DivideByZeroException视图?

后续问题已在此处发布.

asp.net-mvc handleerror asp.net-mvc-3

1
推荐指数
1
解决办法
4831
查看次数