ASP.net MVC [HandleError] exceções não captura
-
03-07-2019 - |
Pergunta
Em dois aplicativo diferente, um costume a outra amostra aplicativo MVC que você começa com um novo projeto VS2008 MVC, [HandleError] não está pegando exceções.
No aplicativo de exemplo eu tenho:
[HandleError]
public class HomeController : Controller
{
public ActionResult Index()
{
ViewData["Message"] = "Welcome to ASP.NET MVC!";
throw new Exception();
return View();
}
public ActionResult About()
{
return View();
}
}
que é apenas o controlador padrão com uma exceção sendo lançada para o teste.
Mas ele não funciona. Em vez de ir para a página de error.aspx padrão, ele mostra as informações de depuração no navegador.
O primeiro problema surgiu em um aplicativo personalizado Eu estou trabalhando em que me levou a testá-lo com o aplicativo de amostra. Pensando que tinha algo a ver com alterações que fiz na aplicação personalizada, deixei o aplicativo de amostra completamente inalterada, com exceção (eca) do lançamento no método do índice.
Estou perplexo. O que eu estou ausente?
Solução
Em Web.config, mudança customErrors:
<system.web>
<customErrors mode="On">
</customErrors>
Se o modo é Off ou RemoteOnly, em seguida, você verá a tela amarela da morte em vez da página de erro personalizada. O raciocínio é que os desenvolvedores geralmente deseja que as informações mais detalhadas sobre a tela amarela da morte.
Outras dicas
Importante: Tenha cuidado para que sua página de erro em si não tem um erro nele
Se isso acontecer, você vai acabar com essa página de erro personalizada ASP.NET e acabam andando em círculos e arrancando os cabelos. Apenas tira tudo para fora da página que poderia possivelmente causar um erro e testá-lo.
Ainda com relação aos 'customErrors' ser ON ou OFF existem vários fatores que contribuem para se ou não a página de erro amigável (seu Errors.aspx) será mostrado ou não.
Veja este Blog (exceto abaixo)
HttpContext.IsCustomErrorEnabled - analisa três fontes diferentes
- imobiliário de retalho
seção do web.config. Isto é um propriedade útil para definir quando a implantação sua aplicação para uma produção servidor. Isso substitui qualquer outro definições para erros personalizados. - do web.config
propriedade de modo de seção. esta definição indica se os erros personalizados são habilitado em tudo, e se assim se estão habilitados somente para pedidos remotos. - propriedade IsLocal do objeto HttpRequest. Se erros personalizados estão habilitados somente para pedidos remotos, você precisa saber se o pedido é de um computador remoto.
A idéia aqui é que você pode ter 'customErrors' desligado durante o desenvolvimento -. Quando você quiser ver os erros e, em seguida, habilitá-lo para produção só
Este artigo MSDN ainda discute o atributo.
Outra razão para este problema pode ser,
Template Em MVC Aplicação (gerado pelo VS2008 / VS2008 Express), Error.aspx (gerado pelo VS) usa página mestra.
Se o acesso Mestre Página qualquer ViewData ele vai jogar exceção de referência nula, então o error.aspx não será mostrado.
Use este código simples como o seu Error.aspx, ele vai resolver o problema, (junto com CustomErrors = On)
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %>
<%= Model.Exception.Message %>
Tenho lutado com isso tão bem e acredito que eu entendo o problema agora.
Em suma os requisitos para ter o trabalho [HandleError]
como esperado são:
Você deve habilitar erros personalizados em web.config E você também deve especificar onde sua exibição de erro é na tag <customErrors>
.
Exemplo:
<customErrors mode="On" defaultRedirect="Error" />
Deixando fora a parte defaultRedirect="Error"
em vez disso, produzir um erro 500 no navegador -. NÃO a página de erro ASP.NET (YSOD)
Além disso, você não tem que estar no modo Release. Eu testei isso com uma compilação de depuração e funcionou muito bem.
O meu ambiente era Visual Studio 2010 usando .NET 4 e o padrão, "Aplicação ASP.NET MVC 2 Web" modelo de projeto.
O que me confundiu foi a documentação MSDN para a classe HandleErrorAttribute. Não diz explicitamente que você ative a erros personalizados no web.config . E eu assumi tudo o que eu precisava era o atributo [Handle Error]
.
Há alguma situação boba que já aconteceu comigo, então pode ser útil para alguém.
Certifique-se de que você adicionou <customErrors mode="On" />
ao arquivo correto web.config
.
Às vezes, (especialmente, quando você trabalha com algo como ReSharper, e abrir seus arquivos com digitando seu nome, mas não via Solution Explorer), você pode simplesmente abrir um web.config a partir Visualizações pasta ou até mesmo de outro projeto.
Watch out: no meu caso eu estava tentando obter o HandleError
atributo para pegar um exception
jogado dentro das Controller
s construtor ! Claro que não vai pegá-lo. O atributo HandleError
só captura exceções lançadas dentro Controller
acções . É ali mesmo na página MSDN (deveria ter prestado mais atenção a isso):
Representa um atributo que é usado para lidar com uma exceção que é lançada por um método de ação.
Outra coisa que estava acontecendo é que OnException(ExceptionContext exceptionContext)
do Controlador substituído método nunca foi sendo chamado. Mais uma vez:. É claro que não iria ser chamado desde que eu estava jogando uma exceção dentro construtor do Controller
Passei uma hora tentando descobrir isso. : O) Espero que ajude a próxima alma ...
Como uma dica: lembre-se que o atributo HandleError
só captura erros 500
. Para os outros você deve declarar a <customErrors>
seção no Web.config
:
<customErrors mode="On">
<error statusCode="403" redirect="~/403" />
<error statusCode="404" redirect="~/404" />
</customErrors>