I stället för att använda try och catch kan du använda Application_Error i global.asax.
protected void Application_Error(object sender, EventArgs e)
{
// Logga error eller dyl.
}
11 svar · 542 visningar · startad av lucgo446
Jag jobbar på en felhantering där jag ska bli kontaktad via email när ett fel uppstått på en av sidorna på en portal.
Min fråga är, har ni en bättre lösning än min som jag specar nedan?
jag använder en try n catch på allt som körs i en metod inkl Page_Load()
void Page_Load(object sender, EventArgs r){
try{
AnropaEnMetod(); // kan alltså vara vilket anrop som hellst
}
catch(Exception e){
Fel ettfel = new Fel(Request.Url.ToString(),e);
}
}
Objektet Fel är ett egendefinierat objekt inom Sitens namnrymnd som tar hand om felet och Tex mailar iväg felet, skriver ut det eller loggar det...
namespace SuperduperPortalen
{
using System;
using System.Web;
using System.Web.Mail;
using System.Text.RegularExpressions;
public class Fel
{
// konstruktor
public Fel(string sida, Exception e)
{
// här skrivs den bara ut hos klienten
System.Web.HttpContext context = System.Web.HttpContext.Current;
string errMsg = "<link rel=\"stylesheet\" href=\"Style.css\">";
errMsg += "<h1>Application Error</h1><hr/>An unexpected error has occurred in this Application. The system " ;
errMsg += "administrators have been notified. Please feel free to contact us with the information " ;
errMsg +="surrounding this error.<br/>";
errMsg +="The error occurred in: "+sida+"<br/>";
errMsg +="Error Message: <font class=\"ErrorMessage\">"+e.Message.ToString()+"</font><hr/>";
errMsg +="<b>Stack Trace:</b><br/>";
errMsg +=e.StackTrace.ToString();
context.Response.Write( Regex.Replace(errMsg,"\n","<br>" ));
context.Response.End();
//context.Response.Redirect("error.aspx?sida="+sida);
}
}
}
Finns det ingen bättre lösning? Det bli jobbigt att klippa in try n catch på alla sidor...
Hälsningar Luc
I stället för att använda try och catch kan du använda Application_Error i global.asax.
protected void Application_Error(object sender, EventArgs e)
{
// Logga error eller dyl.
}
jo jag har kollat på den lösningen men Application_Error triggas inte av Exceptions vad jag har förstått... utan av runtimeerror....
Application_Error triggas inte av Exceptions vad jag har förstått... utan av runtimeerror....
Är inte Exceptions och runtimeerror samma sak?????
- M
Application_Error fångar alla exceptions som du inte fångar. Förutom det finns det Page_Error på sidnivå:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspnet/html/asp07232001.asp
Öht bör du nog undvika att hantera alla fel på samma sätt med catch(Exception e) . Är det lika allvarligt om en typkonvertering misslyckas som om en hårddisk har lagt av?
Tydligen inte...
Jag har provat med Application_Error men den triggas inte av felen som Catch plockar upp... fel av typen, FileNotFoundException eller OleDbException mfl...
Vet ni hur man triggar Application_Error för att testa det? simulera ett fel menar jag.
Sätt en breakpoint i Application_Error och skriv:
throw new System.IO.FileNotFoundException ("Fil saknas.");
så ser du att den triggas. (Om du inte fångar felet nån annanstans.)
näe jag får det inte att köra koden som jag har i Application_Error
protected void Application_Error(Object sender, EventArgs e)
{
string errMsg = "<link rel=\"stylesheet\" href=\"nkpg.css\">";
errMsg += "<h1>Application Error</h1><hr/>An unexpected error has occurred in this Application. The system " +
"administrators have been notified. Please feel free to contact us with the information " +
"surrounding this error.<br/>"+
"The error occurred in: "+Request.Url.ToString()+"<br/>"+
"Error Message: <font class=\"ErrorMessage\">"+Server.GetLastError().Message.ToString()+"</font><hr/>"+
"<b>Stack Trace:</b><br/>"+
Server.GetLastError().ToString();
Response.Write( errMsg );
if (!EventLog.SourceExists("nkpg.COM"))
{
EventLog.CreateEventSource("nkpg.COM", "Application");
}
EventLog.WriteEntry("nkpg.COM", Server.GetLastError().Message, EventLogEntryType.Error);
Server.ClearError();
}
Kan det ha med vad man har för inställningar i Web.config?
<customErrors mode="Off"/>
Nä, det tror jag inte. Var gör du throw:en? Inte inne i ett try-block, väl?
Jo, men det är ju rätt och det innebär att den har triggats. Den texten du ser läggs på i slutet av Application_Error, utanför din kontroll. Vill du slippa den måste du redirecta eller göra en response.end().
Kör enbart detta i ett projekt:
void Page_Load(object sender, EventArgs r){
throw new System.IO.FileNotFoundException ("Fil saknas.");
}
protected void Application_Error(Object sender, EventArgs e)
{
string s = Server.GetLastError().InnerException.Message.ToString();
System.Web.HttpContext.Current.Response.Write("<html><body>");
System.Web.HttpContext.Current.Response.Write("Application_Error: " + s);
System.Web.HttpContext.Current.Response.Write("</body></html>");
System.Web.HttpContext.Current.Response.End();
}
så förstår du vad jag menar.
Bingo, Jag jobbar vidare på den! Tack niko och ni andra!