Estou desenvolvendo um site de base MVC3 e estou procurando uma solução para lidar com erros e renderizar visualizações personalizadas para cada tipo de erro. Imagine que eu tenho um controlador "Erro", onde sua ação principal é "Índice" (página de erro genérica) e esse controlador terá mais algumas ações para os erros que podem aparecer para o usuário como "Handle500" ou "HandleActionNotFound".
Portanto, todo erro que possa ocorrer no site pode ser tratado por esse controlador "Erro" (exemplos: "Controlador" ou "Ação" não encontrado, 500, 404, dbException etc.).
Estou usando o arquivo Sitemap para definir os caminhos do site (e não o roteamento).
Esta pergunta já foi respondida, esta é uma resposta para Gweebz
Meu método applicaiton_error final é o seguinte:
protected void Application_Error() {
//while my project is running in debug mode
if (HttpContext.Current.IsDebuggingEnabled && WebConfigurationManager.AppSettings["EnableCustomErrorPage"].Equals("false"))
{
Log.Logger.Error("unhandled exception: ", Server.GetLastError());
}
else
{
try
{
var exception = Server.GetLastError();
Log.Logger.Error("unhandled exception: ", exception);
Response.Clear();
Server.ClearError();
var routeData = new RouteData();
routeData.Values["controller"] = "Errors";
routeData.Values["action"] = "General";
routeData.Values["exception"] = exception;
IController errorsController = new ErrorsController();
var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
errorsController.Execute(rc);
}
catch (Exception e)
{
//if Error controller failed for same reason, we will display static HTML error page
Log.Logger.Fatal("failed to display error page, fallback to HTML error: ", e);
Response.TransmitFile("~/error.html");
}
}
}
fonte
Respostas:
Aqui está um exemplo de como eu manejo erros personalizados. Eu defino um
ErrorsController
com ações que manipulam diferentes erros HTTP:e depois assino o
Application_Error
inGlobal.asax
e invoco esse controlador:fonte
Execute
é um método definido naIController
interface. Isso não pode ser protegido. Olhe meu código com mais cuidado:IController errorsController = new ErrorsController();
e observe o tipo daerrorsController
variável na qual estou invocando oExecute
método. É do tipo,IController
então não há absolutamente nada impedindo que você chame esse método. E, a propósito,Execute
foi protegido na classe Controller, bem como no MVC 3, então não há mudanças a esse respeito.Response.ContentType = "text/html";
Aqui estão mais artigos Como criar páginas de erro personalizadas com o MVC http://kitsula.com/Article/MVC-Custom-Error-Pages .
fonte
Você também pode fazer isso no arquivo Web.Config. Aqui está um exemplo que funciona no IIS 7.5.
fonte
Vejo que você adicionou um valor de configuração
EnableCustomErrorPage
e também está verificandoIsDebuggingEnabled
se deseja executar ou não o tratamento de erros.Como já existe uma
<customErrors/>
configuração no ASP.NET (que é exatamente para esse fim), é mais fácil dizer:Em seguida, na configuração que você colocaria,
<customErrors mode="RemoteOnly" />
que é seguro implantar dessa maneira, e quando precisar testar sua página de erro personalizada, defina-a<customErrors mode="On" />
para que você possa verificar se funciona.Observe que você também precisa verificar se
HttpContext.Current
é nulo, pois uma exceçãoApplication_Start
ainda será esse método, embora não haja um contexto ativo.fonte
Você pode exibir uma página de erro fácil de usar com o código de status http correto, implementando o módulo User Friendly Exception Handling, de Jeff Atwood, com uma pequena modificação no código de status http. Funciona sem redirecionamentos. Embora o código seja de 2004 (!), Ele funciona bem com o MVC. Ele pode ser configurado inteiramente no seu web.config, sem nenhuma alteração no código-fonte do projeto MVC.
A modificação necessária para retornar o status HTTP original em vez de um
200
status é descrita nesta postagem do fórum relacionada .Basicamente, no Handler.vb, você pode adicionar algo como:
fonte
Estou usando o MVC 4.5 e estava tendo problemas com a solução de Darin. Nota: A solução de Darin é excelente e eu a usei para criar minha solução. Aqui está minha solução modificada:
fonte