O atributo ASP.MVC HandleError não funciona
Sei que é um problema comum, mas acompanhei muitas discussões sem resultado.
Estou tentando lidar com erros com o atributo HandleError ASP.MVC. Estou usando o MVC 4.
A página Meu erro está em Views / Shared / Error.cshtml e tem a seguinte aparência:
Test error page
<hgroup class="title">
<h1 class="error">Error.</h1>
<h2 class="error">An error occurred while processing your request.</h2>
</hgroup>
Meu FilterConfig.cs na pasta App-Start é:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
}
Meu controlador:
public class TestController : Controller
{
[HandleError(View = "Error")]
public ActionResult Index()
{
throw new Exception("oops");
}
}
E, finalmente, meu Web.config in possui o seguinte nó:
<customErrors mode="On" defaultRedirect="Error">
</customErrors>
Quando eu chamo a ação do controlador, recebo uma tela branca com o seguinte texto:
Erro de Servidor na '/' Aplicação.Descrição do erro de tempo de execução: ocorreu uma exceção ao processar sua solicitação. Além disso, ocorreu outra exceção ao executar a página de erro personalizada para a primeira exceção. A solicitação foi encerrada.
Se defaultRedirect = "Erro" não estiver definido no Web.config, a tela amarela será exibida com o seguinte texto:
Erro de Servidor na '/' Aplicação.Descrição do erro de tempo de execução: ocorreu um erro no aplicativo no servidor. As configurações atuais de erro personalizado para este aplicativo impedem a exibição dos detalhes do erro do aplicativo.
Detalhes: para permitir que os detalhes desta mensagem de erro específica sejam visíveis na máquina do servidor local, crie uma tag em um arquivo de configuração "web.config" localizado no diretório raiz do aplicativo Web atual. Essa tag deve ter o atributo "mode" definido como "RemoteOnly". Para permitir que os detalhes sejam visualizados em máquinas remotas, defina "mode" como "Off".
Notas: A página de erro atual que você está vendo pode ser substituída por uma página de erro personalizada modificando o atributo "defaultRedirect" da tag de configuração do aplicativo para apontar para um URL da página de erro customizada.
Alguém sabe o que pode estar errado?
EDITAR:
Os erros foram causados pelo uso de layout fortemente tipado. Quando o erro é acionado, o mecanismo de tratamento de erros do MVC está criando o objeto HandleErrorInfo que é passado para a visualização Error. No entanto, se usarmos um layout fortemente digitado, os tipos não corresponderão.
A solução no meu caso está usando o método Application_Error no Global.asax, que foi perfeitamente descrito pelo SBirthare abaixo.