我试图拦截所有异常,但代码永远不会运行。我已经尝试将其添加到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);
}
}
答案 0 :(得分:5)
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
答案 1 :(得分:4)
如评论中所述,过滤器属性仅适用于控制器中的操作。如果您还希望捕获其他类中的错误或代码进入操作之前发生的错误,则需要覆盖Application_Error
中的Global.asax
方法:
protected void Application_Error(object sender, EventArgs e)
{
log.Info("inside on exception");
}