Nesta dica vamos tratar das exceções ocorridas nas páginas ASP.NET do cliente e, em particular, nas páginas com tecnologia AJAX. Trata-se, portanto, de capturar e processar erros JavaScript evitando erros embaraçosos e, muitas vezes, bloqueando no nosso cliente web.
Vamos supor que os nossos leitores têm um mínimo de conhecimento sobre a plataforma .NET e com as páginas ASP.NET com tecnologia AJAX. Além disso, tomaremos como base o Framework.NET 3.5 com o IDE Microsoft Visual Studio 2008.
O arquivo "Global.asax" nos dá a possibilidade de centralizar a gestão de erros capturando qualquer erro não tratado em nossa aplicação web. Isso nos permitirá, por exemplo, redirecionar o nosso usuário para uma página web personalizada tratando o erro em curso, em função do seu tipo.
Se, por exemplo, forçarmos um erro em um evento de clique de um botão ASP.NET:
protected void btn_Click(object sender, EventArgs e) { throw new Exception("Exceção a ser testada!"); } A exceção não sendo gerada dentro do método, ainda poderemos capturar no método "Application_Error" do arquivo "Global.asax" protected void Application_Error(object sender, EventArgs e) { // Capturar o último erro ocorrido Exceção exception = Server.GetLastError().GetBaseException(); try { // Colocar o erro em uma memória da sessão Context.Session["Excep"] = exceção; // Redirecionar a nossa chamada para a página de erro this.Response.Redirect("~/PáginaDeErro.aspx"); } catch (Exception innerEx) { string errorMsg = "Ocorreu um erro durante o processamento da exceção": + exceção.Mensagem + ". "; errorMsg += Environment.NewLine + innerEx.ToString(); } }
Claro, normalmente devemos acrescentar à nossa função de gestão de erro uma hospedagem e, se necessário, um tratamento de cada caso, em função da natureza da exceção levantada.
Finalmente, podemos redirecionar nossos usuários da Web para uma página de erro exibindo uma mensagem apropriada.
Ao trabalhar com a tecnologia AJAX, sempre tendemos a enriquecer o nosso cliente web com código JavaScript, o que aumenta o risco de erros a nível do cliente. Neste caso, seria aconselhado capturar e gerenciar todos os erros JavaScript e, possivelmente, hospedar ou enviar por e-mail a um técnico a fim de acompanhar e manter o site ou a aplicação web.
Começando pela simulação de uma exceção JavaScript no clique de um botão. Nosso botão é o seguinte:
<input type="button" value="Teste de erro JavaScript" onclick="javascript: testeDeErroJavaScript();" /> Ao chamar a nossa função JavaScript geramos o erro da seguinte forma: function testeDeErroJavaScript() { try { throw 'Teste de erro JavaSript !'; } catch (exceção) { alert(exceção); } }
Aqui decidimos gerir a nossa exceção a nível de função chamada, mas atualmente supomos que temos erros potencialmente possíveis e que não geramos todas as vezes, obrigatoriamente. Este é o caso quando simulamos nossa exceção da seguinte maneira:
function testeDeErroJavaScript() { throw 'Teste de erro JavaSript !'; } Neste caso, podemos aproveitar do evento "onerror" do objeto JavaScript "Window" da seguinte forma: window.onerror = function() { alert('An error has occurred!') return true; }
Isso nos permite capturar qualquer erro JavaScript não administrado, podendo se apresentar no nosso código de cliente.
Depois de capturar o erro, o ideal seria transmitir o evento ao servidor para um gestão mais elaborada, ou seja, uma hospedagem, uma advertência por e-mail ao webmaster, etc.
Para isso, vamos optar pela chamada de um serviço Web ASP.NET, transmitindo-lhe as informações necessárias. A escolha de uma chamada AJAX, oferece a vantagem de manter o funcionamento da nossa página corretamente, mesmo após o advento do erro.
Vamos construir o nosso serviço Web:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; namespace ApplicationWebAjax { /// <summary> /// Summary description for ServiceWebAjax /// </summary> [WebService(Namespace = "https://www.bing.com/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. [System.Web.Script.Services.ScriptService] public class ServiceWebAjax : System.Web.Services.WebService { [WebMethod(EnableSession=true)] public string GereException(string errorMsg, string url, int lineNumber) { // Aqui adicionar o seu código de hospedagem, ... return "Erro traitado a nível do servidor!"; } } }
Claro, você deverá adicionar seu tratamento específico, com base na expectativa de sua aplicação. Posteriormente, devemos modificar 'o nosso evento "onerror", da seguinte maneira:
window.onerror = function(errorMsg, url, lineNumber) { ApplicationWebAjax.ServiceWebAjax.GereException(errorMsg, url, lineNumber, GereException_SucceededCallback, FailedCallback); alert(errorMsg); return true; }
Observe a presença dos parâmetros "URL" e "lineNumber" muito úteis durante a especificação da nossa exceção.
Além disso, é preciso acrescentar as funções que processam os retornos de nossa chamada AJAX , em sucesso, ou em fracasso:
function GereException_SucceededCallback(resultado) { document.getElementById('testDiv').innerHTML += '<b>' + resultado + '</b><br />'; } function FailedCallback(error) { var stackTrace = error.get_stackTrace(); var message = error.get_message(); var statusCode = error.get_statusCode(); var exceptionType = error.get_exceptionType(); var timedout = error.get_timedOut(); alert("Stack Trace: " + stackTrace + "nr" + "Service Error: " + message + "nr" + "Status Code: " + statusCode + "nr" + "Exception Type: " + exceptionType + "nr" + "Timedout: " + timedout); }
Esta dica oferece conhecimentos básicos para a captura e gestão de erros em ASP.NET, mas qualquer aplicativo requer a introdução de especificidade em função de suas necessidades. Ele deverá ser completado, em alguns casos, por um sistema de hospedagem e envio automático de alertas por e-mail.