Atualmente, estou usando log4net em meu aplicativo ASP.NET MVC para registrar exceções. Estou fazendo isso fazendo com que todos os meus controladores herdem de uma classe BaseController. No evento OnActionExecuting do BaseController, registro todas as exceções que possam ter ocorrido:
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
// Log any exceptions
ILog log = LogManager.GetLogger(filterContext.Controller.GetType());
if (filterContext.Exception != null)
{
log.Error("Unhandled exception: " + filterContext.Exception.Message +
". Stack trace: " + filterContext.Exception.StackTrace,
filterContext.Exception);
}
}
Isso funciona muito bem se uma exceção não tratada ocorreu durante uma ação do controlador.
Quanto aos erros 404, eu tenho um erro personalizado configurado em meu web.config assim:
<customErrors mode="On">
<error statusCode="404" redirect="~/page-not-found"/>
</customErrors>
E na ação do controlador que lida com o url "página não encontrada", eu registro o URL original que está sendo solicitado:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult PageNotFound()
{
log.Warn("404 page not found - " + Utils.SafeString(Request.QueryString["aspxerrorpath"]));
return View();
}
E isso também funciona.
O problema que estou tendo é como registrar os erros que estão nas próprias páginas .aspx. Digamos que eu tenha um erro de compilação em uma das páginas ou algum código embutido que gerará uma exceção:
<% ThisIsNotAValidFunction(); %>
<% throw new Exception("help!"); %>
Parece que o atributo HandleError está redirecionando isso corretamente para minha página Error.aspx na pasta Compartilhada, mas definitivamente não está sendo capturado pelo método OnActionExecuted do meu BaseController. Eu estava pensando que talvez pudesse colocar o código de registro na própria página Error.aspx, mas não tenho certeza de como recuperar as informações de erro nesse nível.
fonte
Respostas:
Eu consideraria simplificar seu aplicativo da web conectando Elmah .
Você adiciona o assembly Elmah ao seu projeto e, em seguida, configura seu web.config. Em seguida, ele registrará as exceções criadas no controlador ou no nível da página. Ele pode ser configurado para fazer logon em vários lugares diferentes (como SQL Server, Email, etc.). Ele também fornece um frontend da Web, para que você possa navegar pelo log de exceções.
É a primeira coisa que adiciono a qualquer aplicativo mvc asp.net que eu criar.
Ainda uso o log4net, mas tendo a usá-lo para registrar depuração / informações e deixar todas as exceções para Elmah.
Você também pode encontrar mais informações na pergunta Como você registra erros (exceções) em seus aplicativos ASP.NET? .
fonte
Você pode conectar-se ao evento OnError no Global.asax.
Algo assim:
fonte
Server
sempre será não nulo.if (ex is HttpException && ((HttpException)ex).GetHttpCode() == 404) return;
MVC3
Criar Atributo que herda de HandleErrorInfoAttribute e inclui sua escolha de registro
Coloque o atributo em Global.asax RegisterGlobalFilters
fonte
Você já pensou em estender o atributo HandleError? Além disso, Scott tem uma boa postagem no blog sobre interceptores de filtro em controladores / ações aqui .
fonte
A visualização Error.aspx é definida assim:
O HandleErrorInfo tem três propriedades: string ActionName string ControllerName Exception Exception
Você deve ser capaz de acessar HandleErrorInfo e, portanto, a Exception dentro da visualização.
fonte
Você pode tentar examinar HttpContext.Error, mas não tenho certeza sobre isso.
fonte