2009-02-24 21 views
11

Ich maile unbehandelte Ausnahmedetails von global.asax. Wie kann ich den Pfad und/oder den Dateinamen der aspx-Datei oder der Assembly-Datei ermitteln, in der eine Ausnahme nicht behandelt wurde?Unbehandelte Ausnahmen mit Global.asax

Diese Information wurde in der Stapelverfolgung der Ausnahme angezeigt, als ich & Tests entwickelte. Wenn ich global.asax in der Produktion bereitgestellt habe, wird diese Information nicht mehr im Stack-Trace angezeigt.

Gibt es eine Möglichkeit, zu dieser Information zu gelangen, während ich mein MailMessage-Objekt in Global.asax erstelle?

Dank

Antwort

12

Wenn dies eine ASP.NET-Anwendung ist, die das Tag vorschlagen, sollten Sie in der Lage sein, etwas wie diese zu tun ... Die ctx.Request.Url.ToString() würde Ihnen den Dateinamen von wo geben Der Fehler ist aufgetreten.

protected void Application_Error(object sender, EventArgs e) 
{ 
    MailMessage msg = new MailMessage(); 
    HttpContext ctx = HttpContext.Current; 

    msg.To.Add(new MailAddress("[email protected]")); 
    msg.From = new MailAddress("[email protected]"); 
    msg.Subject = "My app had an issue..."; 
    msg.Priority = MailPriority.High; 

    StringBuilder sb = new StringBuilder(); 
    sb.Append(ctx.Request.Url.ToString() + System.Environment.NewLine); 
    sb.Append("Source:" + System.Environment.NewLine + ctx.Server.GetLastError().Source.ToString()); 
    sb.Append("Message:" + System.Environment.NewLine + ctx.Server.GetLastError().Message.ToString()); 
    sb.Append("Stack Trace:" + System.Environment.NewLine + ctx.Server.GetLastError().StackTrace.ToString()); 
    msg.Body = sb.ToString(); 

    //CONFIGURE SMTP OBJECT 
    SmtpClient smtp = new SmtpClient("myhost"); 

    //SEND EMAIL 
    smtp.Send(msg); 

    //REDIRECT USER TO ERROR PAGE 
    Server.Transfer("~/ErrorPage.aspx"); 
} 
+0

Ehrfürchtig. Vielen Dank! –

+0

HttpContext.Current.Url gibt Ihnen die aktuelle URL. Aber die Frage nach dem Pfad und/oder dem Dateinamen der Assembly. – RoadWarrior

+0

@RoadWarrior: Da es sich um eine ASP.NET-Anwendung handelt, ist die URL wahrscheinlich gut genug. Da er die Antwort akzeptiert hat, nehme ich an, dass es seinen Bedürfnissen entspricht. – RSolberg

0

In Visual Studio, müssen Sie das Release-Build setzen Bugsymbol zu erzeugen. Anders als beim Debug-Build ist dies nicht standardmäßig festgelegt. Dadurch erhalten Sie die vollständige Ablaufverfolgung für den Ausnahme-Stack.

Auch dann können Optimierungen durch den JIT-Compiler (z. B. Inlining) dazu führen, dass Sie in Ihrem Stack-Trace nicht die richtige Zeilennummer erhalten. Wenn Sie sich über die Zeilennummer sicher sein wollen, können Sie den Release-Build auch auf "keine Optimierung" setzen. Dies kann jedoch dazu führen, dass Ihre App eine geringere Leistung und/oder einen geringeren Durchsatz aufweist (Letzteres ist in einer Web-App tendenziell wichtiger).

BEARBEITEN: Sie finden die Einstellung "Debugging-Symbole generieren", indem Sie im Fenster Projektmappen-Explorer mit der rechten Maustaste auf das Projekt klicken und den Menüpunkt "Eigenschaften" wählen. Wechseln Sie dann zu Konfigurationseigenschaften> Erstellen> Debuginformationen generieren und setzen Sie den Wert auf "true" oder "false". Die Einstellung Code optimieren befindet sich im selben Fenster.

+0

Wie wird das gemacht? –

Verwandte Themen