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?

Foi útil?

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

  1. 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.
  2. 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.
  3. 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 Controllers 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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top