Frage

Ich habe den folgenden Code in einer Klasse von mir. Der Zweck dieser Klasse ist die Balance von einem Webserver zu erhalten. Nur für den Fall etwas schief geht mit der Balance zu bekommen. Ich werde eine Ausnahme behandeln. Doch all dies ist einfach zu tun. Aber ich frage mich doch, was ich in meiner catch-Anweisung zurück.

Die meisten Beispiele ich nur an die Konsole schreiben sah mit:

Console.WriteLine(ex.Message);

Das ist alles sehr gut. Aber in einer realen Anwendung was die meisten Entwickler tun?

 //Download only when the webclient is not busy.
        if (!wc.IsBusy)
        { 
            // Sleep for 1/2 second to give the server time to update the balance.
            System.Threading.Thread.Sleep(500);

            try
            {
                // Download the current balance.
                wc.DownloadStringAsync(new Uri(strURL));
            }
            catch (WebException ex)
            {
                Console.Write("GetBalance(): " + ex.Message);
            }
        }
        else
        {
            Console.Write("Busy please try again");
        }

Meine Funktion zur Zeit void zurückgibt. Und ich frage mich nur, was sonst würde ich zurück, wenn der Webclient besetzt ist?

Vielen Dank für jede Beratung,

War es hilfreich?

Lösung

Verwenden Sie keine Ausnahme fangen, wenn Sie es nicht verarbeiten können. Wenn Sie nur einen Wert zurückgeben, die anrufende Methode zu überprüfen hat, wenn der Wert ein echtes Ergebnis ist oder nur ein Indikator für eine Ausnahme. Und nun muss diese Methode entscheiden, was zu tun und zurück. Und das Verfahren diese Methode aufrufen. Und die Methode ...

Also lassen Sie nur die Ausnahme Blase in den Stack und fängt es irgendwo, wo man damit umgehen kann. Vielleicht zeigen sie direkt unter der Benutzeroberfläche und dann ein Meldungsfeld gefragt werden, ob die Benutzer Informationen wiederholen oder zu zeigen, wie das Problem zu lösen. Wenn Sie keine Benutzeroberfläche haben, fangen sie irgendwo, wo man das Problem lösen kann und versuchen Sie es erneut. Wenn es sich um ein vorübergehendes Problem ist, wiederholen Sie die ganze Aufgabe auf einem vernünftigen Niveau, bis der Aufruf erfolgreich ist.

Wenn Sie etwas anmelden möchten, verwenden Sie das folgende Muster die Ausnahme ein rethrow es loggt sein.

try
{
   DoStuff();
}
catch (Exception exception)
{
   Log(exception.ToString());

   throw;
}

Beachten Sie, dass es throw; und nicht throw exception;. Wenn Sie das später tun, verlieren Sie die Original-Stack-Trace. Wenn Sie weitere Informationen über die Ursache der Ausnahme entnehmen können, sollten Sie die abgefangene Ausnahme in eine sinnvollere Ausnahme mit zusätzlichen Informationen wickeln.

try
{
   DoStuff();
}
catch (SpecificMeaninglessException exception)
{
   Log(exception.ToString());

   throw new MeaningfulException("Details about the error.", exception);
}
catch (Exception exception)
{
   Log(exception.ToString());

   throw;
}

Andere Tipps

Sie sollten verwenden ex.ToString () Methode

  

Exception.Message   enthält eine einfache Beschreibung der Ausnahme (beispielsweise „Objektverweis nicht gesetzt ...“).

     

Exception.ToString ()   enthält eine Beschreibung der Ausnahme zusammen mit einem kompletten Stack-Trace.

Ausnahmebehandlung Best Practices in .NET

Sie könnten das Verfahren, wenn der Kunde ist damit beschäftigt erneut ausführen, aber eine gewisse Zeit, bevor Wiederholungen warten? Potenziell mit einem Fehler nach x Wiederholungen.

Wenn Sie stattdessen wollen sich bewegen und melden Sie sich einfach das Problem, Ihre catch-Anweisung könnte die Ausnahme zu einer dateibasierten log log, Ereignisanzeige, in eine Datenbank vorlegen, heben Sie eine Benachrichtigung (E-Mail, SMS etc.), wenn es notwendig ist.

Abhängig von der Schwere der Ausnahme.

Ich würde vorschlagen, Blick in dem Ausnahme-Block von Patterns & Practices

Wenn Sie nur daran interessiert sind, die Ausnahme bei der Betrachtung Sie die Ausnahme werfen wieder sollte so die jemals über den Umgang mit ihm plant, wird es nach wie vor erhalten.

Sie sicherlich nicht wollen, eine nicht behandelte Ausnahme maskieren. Lassen Sie das sprudeln durch den Stapel. Aber wenn Sie sich fragen, was zurückgeben, wenn der Web-Client gerade damit beschäftigt ist, wie etwa entweder ein zufälliges Intervall oder ein sinnvolles Intervall zurückkehrt, dass die Funktion Anrufer, bevor warten sollten wieder die Balance zum Download? Eine Zufallszahl könnte Last verteilen oder auf andere Weise ein Kollisionsproblem mildern. Ein sinnvolles Intervall wieder werden könnte, basierend auf dem aktuellen Stand des den Servers gesendet.

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