2

我试图拦截所有异常,但代码永远不会运行。我试过把GlobalFilters它放在 ,也把它直接放在我的方法上。

我的属性:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
public class HandleExceptionAttribute : HandleErrorAttribute 
{
    private ILog log = LogManager.GetLogger(typeof(HandleExceptionAttribute));

    public override void OnException(ExceptionContext filterContext) 
    {
        log.Info("inside on exception"); // this never appears
    }
}

我的课:

public class Tester 
{
    [HandleException]
    public void Except() 
    {
        var asd = 0;
        var qwe = 1 / asd;              
    }
}

除以零给我一个异常,我的调试器捕获它,我继续,但没有任何内容写入日志文件。

记录器工作。其他日志出现在文件中。即使我禁用调试,它也不会读取日志文件,所以它不是调试器的错误。

在 IIS Express 上运行它。Windows 7的。

编辑:

把东西移到控制器上。还是行不通

public class UserController : ApiController 
{
    private ILog log = LogManager.GetLogger(typeof(UserController));

    [HandleException]
    [CheckModelForNull]
    [ValidateModelState]
    public object Post([FromBody]User user) 
    {    
        var asd = 0;
        var qwe = 1 / asd;
        return new HttpStatusCodeResult(HttpStatusCode.OK);
    }
}
4

2 回答 2

7

ApiControllers 不使用HandleErrorAttribute

应该更好用ExceptionFilterAttribute

public class NotImplExceptionFilterAttribute : ExceptionFilterAttribute 
{
    public override void OnException(HttpActionExecutedContext context)
    {
       log.error("ERROR",context.Exception);
    }
}

http://www.asp.net/web-api/overview/web-api-routing-and-actions/exception-handling

于 2014-01-23T17:46:33.727 回答
4

如评论中所述,过滤器属性仅适用于控制器中的操作。如果您还想捕获其他类的错误或代码进入操作之前发生的事情,您需要覆盖Application_Error方法Global.asax

protected void Application_Error(object sender, EventArgs e)
{
    log.Info("inside on exception"); 
}
于 2014-01-23T17:16:27.810 回答