我有一个全局异常过滤器,名为LogErrorAttribute
:
public class LogErrorAttribute : IExceptionFilter
{
private ILogUtils logUtils;
public void OnException(ExceptionContext filterContext)
{
if (this.logUtils == null)
{
this.logUtils = StructureMapConfig.Container.GetInstance<ILogUtils>();
}
this.logUtils.LogError(HttpContext.Current.User.Identity.GetUserId(), "Unknown error.", filterContext.Exception);
}
}
它注册在标准的HandleErrorAttribute
过滤器中:
filters.Add(new LogErrorAttribute());
filters.Add(new HandleErrorAttribute());
我是这样注册这些过滤器的:
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
我还有一个 Application_Error
备选方案:
protected void Application_Error()
{
var exception = Server.GetLastError();
Server.ClearError();
var httpException = exception as HttpException;
//Logging goes here
var routeData = new RouteData();
routeData.Values["controller"] = "Error";
routeData.Values["action"] = "Index";
if (httpException != null)
{
if (httpException.GetHttpCode() == 404)
{
routeData.Values["action"] = "NotFound";
}
Response.StatusCode = httpException.GetHttpCode();
}
else
{
Response.StatusCode = 500;
}
// Avoid IIS7 getting involved
Response.TrySkipIisCustomErrors = true;
// Execute the error controller
if (exception != null)
{
this.errorLogger.Log(LogLevel.Error, "An unknown exception has occurred.", exception);
}
else if (httpException != null)
{
this.errorLogger.Log(LogLevel.Error, "An unknown HTTP exception has occurred.", httpException);
}
else
{
this.errorLogger.Log(LogLevel.Error, "An unknown error has occurred.");
}
}
现在,我有一个 API 控制器,它从数据库中获取一些数据,然后使用 AutoMapper
将模型映射到视图模型:
var viewModels = AutoMapper.Mapper.Map(users, new List<UserViewModel>());
在AutoMapper
配置中,为其中一个属性执行自定义解析器:
var appModuleAssignments = this.appModuleAssignmentManager.Get(userId);
var appModules = appModuleAssignments.Select(x => this.appModuleManager.Get(x.AppModuleId));
return AutoMapper.Mapper.Map(appModules, new List<AppModuleViewModel>());
目前我正在强制appModuleManager.Get
语句抛出常规异常:
throw new Exception("Testing global filter.");
这随后在 AutoMapper
中抛出异常,两者都未被处理,但全局过滤器和 Application_Error
都没有捕获到此异常。
我做错了什么?
发布后我做了几件事:
- 在
Web.config
中添加了customErrors
属性以将其打开。 - 删除了全局过滤器中的
HandleErrorAttribute
,因为我意识到它会在运行时将错误标记为已处理。虽然我不指望它会执行,因为此错误发生在控制器之外,但它可能会在以后咬我一口。