webForumDet fria alternativet

lösning på felhantering

.NET

11 svar · 542 visningar · startad av lucgo446

Medlem sedan aug. 2002221 inlägg
Frågan#1

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

Medlem sedan apr. 20012 266 inlägg
#2

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.
}
Medlem sedan aug. 2002221 inlägg
#3

jo jag har kollat på den lösningen men Application_Error triggas inte av Exceptions vad jag har förstått... utan av runtimeerror....

Medlem sedan maj 20012 812 inlägg
#4

Application_Error triggas inte av Exceptions vad jag har förstått... utan av runtimeerror....

Är inte Exceptions och runtimeerror samma sak?????

- M

Medlem sedan juni 20022 599 inlägg
#5

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?

Medlem sedan aug. 2002221 inlägg
#6

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.

Medlem sedan juni 20022 599 inlägg
#7

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.)

Medlem sedan aug. 2002221 inlägg
#8

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"/>

Medlem sedan juni 20022 599 inlägg
#9

Nä, det tror jag inte. Var gör du throw:en? Inte inne i ett try-block, väl?

Medlem sedan aug. 2002221 inlägg
#10

nej nej, alltså jag får upp asp.net default fel trace eller vad det heter...

tex

Rad 10:
Rad 11: void Page_Load(object sender, EventArgs r){
Rad 12: throw new System.IO.FileNotFoundException ("Fil saknas.");

och varken page_error eller app_error triggas

Medlem sedan juni 20022 599 inlägg
#11

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.

Medlem sedan aug. 2002221 inlägg
#12

Bingo, Jag jobbar vidare på den! Tack niko och ni andra!

274 ms totalt · 4 externa anrop · v20260731065814-full.2f471f9e
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
140 ms — ändringar (db)