Frage

Was ist eine gute Fehlerbehandlung Praxis für eine asp.net Website? Beispiele? Dank!

War es hilfreich?

Lösung

Wie bei jedem .net Projekt finde ich die beste Art und Weise nur Typen spezifische Fehler zu fangen, wenn sie kann auf der angegebenen Seite passieren.

Zum Beispiel können Sie Format Ausnahmen für einen Benutzer gegebenen Eingang fangen können (nur für den Fall JavaScript Validierung fehlschlägt und Sie verwenden TryParse nicht), aber immer verlassen den Fang von der obersten Ebene Ausnahme von der globalen Fehlerbehandlung.

     try
        {
            //Code that could error here
        }
        catch (FormatException ex)
        {
            //Code to tell user of their error
            //all other errors will be handled 
            //by the global error handler
        }

Sie können die Open-Source verwenden Elmah (Error Logging Module und Handler) für ASP .Net diese Top-Level / global Fehler für Sie fangen zu tun, wenn Sie wollen.

Mit Elmah kann es ein Protokoll der Fehler erstellen, obwohl eine einfache sichtbar ist konfigurieren Web-Interface. Sie können auch verschiedene Arten von Fehlern filtern und benutzerdefinierte Fehlerseiten Ihrer eigenen für unterschiedliche Fehlertypen haben.

Andere Tipps

Eine Praxis, die ich finde, besonders nützlich zu sein, ist eine generische Fehlerseite zu erstellen, und dann stellen Sie Ihren defaultRedirect auf dem Custom Knoten der web.config zu dieser Fehlerseite.

Dann Einrichtung Ihrer global.asax für alle nicht behandelten Ausnahmen anmelden und dann legte sie (die nicht behandelte Ausnahmen) in einer statischen Eigenschaft auf einige Klasse (Ich habe eine Klasse ErrorUtil mit einer statischen LetzteFehlerNr Eigenschaft genannt). Ihre Fehlerseite kann dann auf dieser Eigenschaft schauen, um festzustellen, was den Benutzer angezeigt werden soll.

Weitere Informationen finden Sie hier: http://www.codeproject.com/KB/aspnet /JcGlobalErrorHandling.aspx

Nun, das ist ziemlich weit offen, die vollständig abgekühlt ist. Ich werde Sie auf ein Wort beziehen .doc Sie von Dot Net Spinne herunterladen können, das ist eigentlich die Grundlage für meine kleine Firma Code-Standard. Die Norm enthält einige sehr nützliche Fehlerbehandlung Tipps.

Ein solches Beispiel für Ausnahmen (Ich erinnere mich nicht, ob dies auf das Dokument Original ist oder wenn wir es auf das Dokument hinzugefügt): Niemals eine „Fang Ausnahme und nichts zu tun.“ Wenn Sie eine Ausnahme zu verbergen, werden Sie nie wissen, ob die Ausnahme passiert ist. Sie sollten immer versuchen, Ausnahmen zu vermeiden, indem sie programmatisch alle Fehlerbedingungen zu überprüfen.

Beispiel von dem, was nicht zu tun:

try
{
   ...
}
catch{}

Sehr frech, wenn Sie einen guten Grund dafür haben.

Sie sollten sicherstellen, dass Sie die meisten Fehler fangen, die von der Anwendung generiert werden und eine freundliche Nachricht an den Benutzer anzuzeigen. Aber natürlich können Sie nicht alle Fehler für die fangen Sie web.config und defaultRedirect von einem anderen Benutzer verwenden können. Ein weiteres sehr praktisches Tool, um die Fehler zu protokollieren ist ELMAH. ELMAH werden alle Fehler, die durch die Anwendung erzeugt anmelden und zeigen es Ihnen in sehr lesbarer Weise. ELMAH in Ihrer Anwendung Anstecken ist so einfach wie wenige Zeilen Code in web.config-Datei hinzufügen und die Montage zu befestigen. Sie sollten auf jeden Fall einen Versuch geben ELMAH es buchstäblich Sie Stunden und Stunden der Schmerz erspart.

http://code.google.com/p/elmah/

  1. -Code defensiv innerhalb jeder Seite für Ausnahmen, die Sie passieren erwarten konnte und sich mit ihnen in geeigneter Weise, also nicht um den Benutzer zu stören jedes Mal eine Ausnahme auftritt.

  2. alle Ausnahmen Log, mit einem Verweis.

  3. Geben Sie eine generische Fehlerseite, für alle nicht behandelten Ausnahmen, die eine Referenz für die Unterstützung zu verwenden, bietet (Unterstützung Details aus den Protokollen identifizieren können). Nicht die tatsächliche Ausnahme angezeigt werden, da die meisten Benutzer werden es nicht verstehen, sondern ist ein mögliches Sicherheitsrisiko dar, da sie Informationen über Ihr System aussetzt (möglicherweise Passwörter usw.).

  4. Sie nicht alle Ausnahmen fangen und mit ihnen nichts tun (wie in der obigen Antwort). Es gibt so gut wie nie einen guten Grund, dies zu tun, gelegentlich können Sie eine bestimmte Ausnahme fangen wollen und nicht absichtlich zu tun, aber dies sollte mit Bedacht verwendet werden.

Es ist nicht immer eine gute Idee, um den Benutzer zu einer Standard-Fehlerseite zu umleiten. Wenn ein Benutzer auf einem Formular arbeitet, können sie wollen nicht weg von der Form umgeleitet werden, die sie gerade arbeiten. Ich habe den gesamten Code, der eine Ausnahme in einem try / catch-Block, und innerhalb des catch-Block dazu führen könnten, spucken ich den Benutzer eine Warnmeldung heraus alarmieren, dass ein Fehler sowie log die Ausnahme in einer Datenbank mit Formulareingabe, Query-String aufgetreten ist usw. ich eine interne Website entwickle, aber so dass die meisten Benutzer rufen sie mich einfach, wenn sie ein Problem haben. Für eine öffentliche Seite, können Sie etwas verwenden wie Elmah wollen.

public string BookLesson(Customer_Info oCustomerInfo, CustLessonBook_Info oCustLessonBookInfo)
    {
        string authenticationID = string.Empty;
        int customerID = 0;
        string message = string.Empty;
        DA_Customer oDACustomer = new DA_Customer();

        using (TransactionScope scope = new TransactionScope())
        {
            if (oDACustomer.ValidateCustomerLoginName(oCustomerInfo.CustId, oCustomerInfo.CustLoginName) == "Y")
            {
                // if a new student
                if (oCustomerInfo.CustId == 0)
                {
                    oCustomerInfo.CustPassword = General.GeneratePassword(6, 8);
                    oCustomerInfo.CustPassword = new DA_InternalUser().GetPassword(oCustomerInfo.CustPassword, false);
                    authenticationID = oDACustomer.Register(oCustomerInfo, ref customerID);
                    oCustLessonBookInfo.CustId = customerID;
                }
                else // if existing student
                {
                    oCustomerInfo.UpdatedByCustomer = "Y";
                    authenticationID = oDACustomer.CustomerUpdateProfile(oCustomerInfo);
                }
                message = authenticationID;
                // insert lesson booking details
                new DA_Lesson().BookLesson(oCustLessonBookInfo);
            }

            else
            {
                message = "login exists";
            }
            scope.Complete();
            return message;
        }

    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top