Tenho uma página de erro personalizada configurada para meu aplicativo:
<customErrors mode="On" defaultRedirect="~/errors/GeneralError.aspx"
/>
Em Global.asax, Application_Error (), o código a seguir funciona para obter os detalhes da exceção:
Exception ex = Server.GetLastError();
if (ex != null)
{
if (ex.GetBaseException() != null)
ex = ex.GetBaseException();
}
Quando chego à minha página de erro (~ / errors / GeneralError.aspx.cs), Server.GetLastError () é nulo
Existe alguma maneira de obter os detalhes da exceção na página de erro, em vez de em Global.asax.cs?
ASP.NET 3.5 no Vista / IIS7
asp.net
exception
web-applications
custom-error-pages
Nailitdown
fonte
fonte
Respostas:
Olhando mais de perto a configuração do meu web.config, um dos comentários nesta postagem é muito útil
Portanto, podemos alterar
customErrors
para adicionar este parâmetro:a
ResponseRewrite
modo nos permite carregar a «página de erro» sem redirecionar o navegador, de modo que a URL permanece a mesma e, o que é importante para mim, as informações de exceção não são perdidas.fonte
UpdatePanel
s; a página de erro não será mais exibida.OK, encontrei esta postagem: http://msdn.microsoft.com/en-us/library/aa479319.aspx
com este diagrama muito ilustrativo:
(fonte: microsoft.com )
em essência, para obter esses detalhes de exceção, eu mesmo preciso armazená-los em Global.asax, para recuperação posterior em minha página de erro personalizada.
parece que a melhor maneira é fazer a maior parte do trabalho em Global.asax, com as páginas de erro personalizadas lidando com conteúdo útil em vez de lógica.
fonte
Uma combinação do que NailItDown e Victor disseram. A maneira preferida / mais fácil é usar seu Global.Asax para armazenar o erro e, em seguida, redirecionar para sua página de erro personalizada.
Global.asax :
Além disso, você precisa configurar seu web.config :
E, finalmente, faça o que for necessário, exceto que você armazenou em sua página de erro :
fonte
Application[]
é um objeto global. Teoricamente, você pode ter uma condição de corrida em que uma segunda página substitui o erro. No entanto, comoSession[]
nem sempre está disponível em condições de erro, acho que essa é a melhor escolha.Tente usar algo como
Server.Transfer("~/ErrorPage.aspx");
noApplication_Error()
método global.asax.csEntão,
Page_Load()
de ErrorPage.aspx.cs, você deve estar bem para fazer algo como:Exception exception = Server.GetLastError().GetBaseException();
Server.Transfer()
parece manter a exceção por aí.fonte
Server.Transfer
depois que uma página é renderizada pela metade, o HTML da página para a qual você transfere é simplesmente concatenado com o que já foi renderizado. Assim, você pode acabar com meia página quebrada seguida pela página de erro abaixo dela.Embora existam várias respostas boas aqui, devo salientar que não é uma boa prática exibir mensagens de exceção do sistema nas páginas de erro (que é o que estou supondo que você deseja fazer). Você pode inadvertidamente revelar coisas que não deseja para usuários mal-intencionados. Por exemplo, as mensagens de exceção do Sql Server são muito detalhadas e podem fornecer o nome de usuário, a senha e as informações de esquema do banco de dados quando ocorre um erro. Essas informações não devem ser exibidas para um usuário final.
fonte
Aqui está minha solução ..
Em Global.aspx:
Em Oops.aspx:
fonte
Uma consideração importante que acho que todos estão faltando aqui é um cenário de balanceamento de carga (web farm). Uma vez que o servidor que está executando global.asax pode ser diferente do servidor que está executando a página de erro personalizada, armazenar o objeto de exceção em Aplicativo não é confiável.
Ainda estou procurando uma solução confiável para este problema em uma configuração de web farm e / ou uma boa explicação do MS sobre por que você simplesmente não pode pegar a exceção com Server.GetLastError na página de erro personalizada como você pode em global.asax Application_Error.
PS Não é seguro armazenar dados na coleção de aplicativos sem primeiro bloqueá-los e depois desbloqueá-los.
fonte
Isso está relacionado a esses 2 tópicos abaixo, quero obter a página GetHtmlErrorMessage e Sessão na página de erro.
A sessão é nula após ResponseRewrite
Por que HttpContext.Session é nulo quando redirectMode = ResponseRewrite
Eu tentei e vi uma solução que não precisa
Server.Transfer() or Response.Redirect()
Primeiro: remova ResponseRewrite em web.config
Web.config
Então Global.asax
Em seguida, errorHandler.aspx.cs
Para referências
http://www.developer.com/net/asp/article.php/3299641/ServerTransfer-Vs-ResponseRedirect.htm
fonte
Funcionou para mim em MVC 5
no
~\Global.asax
em
~\Controllers
criarErrorController.cs
em
~\Models
criarFunctionTools.cs
em
~\Views
Criar PastaError
e em~\Views\Error
CriarError.cshtml
Se você inserir este endereço
localhost/Error
E se ocorrer um erro
Como pode ser, em vez de exibir erros, a variável 'log' deve ser armazenada no banco de dados
fonte
Acho que você tem algumas opções aqui.
você pode armazenar a última exceção na sessão e recuperá-la de sua página de erro personalizada; ou você pode apenas redirecionar para sua página de erro personalizada dentro do evento Application_error. Se você escolher a última opção, certifique-se de usar o método Server.Transfer.
fonte