Frage

Was sind Ihre Gedanken auf Code, der wie folgt aussieht:

public void doSomething()
{
    try
    {
       // actual code goes here
    }
    catch (Exception ex)
    {
        throw;
    }
}

Das Problem, das ich sehe, ist der eigentliche Fehler nicht behandelt wird, sondern nur die Ausnahme an einer anderen Stelle zu werfen. Ich finde es schwer zu debuggen, weil ich keine Zeilennummer, wo das eigentliche Problem ist.

Also meine Frage ist, warum würde das gut sein?

---- ---- EDIT

Aus den Antworten sieht es aus wie die meisten Leute sagen, es sinnlos ist, dies zu tun mit keine benutzerdefinierten oder bestimmte Ausnahmen gefangen. Das ist, was ich wollte Kommentare auf, wenn keine spezifische Ausnahme abgefangen wird. Ich kann den Punkt tatsächlich etwas mit einem abgefangene Ausnahme sehen tun, nur nicht die Art und Weise dieser Code ist.

War es hilfreich?

Lösung

Je nachdem, welche Qualität man es suchen ist die Ausnahme in einem anderen Ort nicht zu werfen. „Werfen“, ohne ein Ziel rethrows die Ausnahme, die von Auslösen einer Ausnahme sehr unterschiedlich ist. In erster Linie ein rethrow zurückgesetzt nicht den Stack-Trace.

In diesem speziellen Beispiel ist der Fang sinnlos, weil er nichts tun. Die Ausnahme ist glücklich erneut ausgelöst und es ist fast, als ob die try / catch gibt es nicht.

Andere Tipps

ich denke, die Konstruktion sollte zur Handhabung der Ausnahmen verwendet werden Sie wissen, dass Sie in Ihrem Code werfen; wenn andere Ausnahme ausgelöst wird, dann nur erneut auslösen.

berücksichtigen, dass werfen; ist anders als throw ex;

throw ex den Stapel auf den neuen Punkt des Werfens gestutzt, nützliche und wertvolle Informationen über die Ausnahme zu verlieren.

public void doSomething()
{
    try
    {
       // actual code goes here
    }
    catch (EspecificException ex)
    {
        HandleException(ex);
    }
    catch (Exception ex)
    {
        throw;
    }
}

Es wäre nicht, im Idealfall der catch-Block eine gewisse Handhabung tun würde, und dann erneut auslösen, z. B.

try
{
    //do something
}
catch (Exception ex)
{
    DoSomething(ex); //handle the exception
    throw;
}

Natürlich ist der Wiederwurf von Nutzen sein wird, wenn Sie einige weitere Behandlung in den oberen Rängen des Codes tun mögen.

mache ich etwas wie das ist ziemlich sinnlos, und im Allgemeinen ich nicht versuchen, die Straße zu gehen, sinnlose Dinge zu tun;)

Für den größten Teil, ich glaube an anziehenden bestimmte Arten von Ausnahmen, die Sie wissen, wie zu behandeln, auch wenn das nur bedeutet, dass Ihre eigene Ausnahme zu schaffen mit mehr Informationen und mit Hilfe der abgefangene Ausnahme als die Innerexception.

Manchmal ist dies sinnvoll - wenn Sie vorhaben, die Ausnahme weiter oben im Call-Stack zu behandeln. Allerdings müssen Sie etwas in diesem catch-Block andere als nur wieder Wurf zu tun für sie Sinn machen, z.B. log den Fehler:

public void doSomething()
{
    try
    {
       // actual code goes here
    }
    catch (Exception ex)
    {
        LogException (ex);  // Log error...
        throw;
    }
}

Ich habe Fälle gesehen, in denen generischen Ausnahmen wie diese gefangen werden und dann in einem benutzerdefinierten Ausnahmeobjekt neu verpackt.

Der Unterschied zwischen dem, und das, was Sie sagen, ist, dass diese benutzerdefinierte Exception-Objekte Weitere Informationen über die tatsächliche Ausnahme halten, was geschah, nicht weniger.

Gut für den Anfang würde ich einfach tun

catch
{
   throw;
}

aber im Grunde, wenn Sie mehrere Arten von Ausnahmen Trapping wurden möglicherweise einige lokal behandeln möchten und andere den Stapel sichern.

z.

catch(SQLException sex) //haha
{
   DoStuff(sex);
}
catch
{
   throw;
}

Abhängig von, was Sie unter „sieht wie folgt aus“, und wenn es nichts anderes in dem catch-Block, sondern ein rethrow ... wenn das der Fall ist der Versuch fängt sinnlos ist, mit der Ausnahme, wie Sie sagen, zu verschleiern, wo die Ausnahme aufgetreten ist. Aber wenn Sie etwas genau dort tun müssen, wo der Fehler aufgetreten ist, aber ich wünschte, die Ausnahme furthur auf den Stapel zu verarbeiten, könnte dies angemessen sein. Aber dann wäre der Fang für die spezifische Ausnahme Sie sind handl; ing, nicht für jede Ausnahme

Das glaube ich nicht nur die Fehler Erneutes Auslösen von Nutzen sein würde. Es sei denn, Sie kümmern sich nicht wirklich um die Fehler in den ersten Platz.

ich denke, es wäre besser, um tatsächlich etwas in dem Fang zu tun.

Sie können die MSDN Ausnahmehandbuch Handhabung .

Im Allgemeinen Block mit Ausnahmebehandlung, die nichts tun ist überhaupt nicht gut, aus dem einfachen Grunde, dass es die .Net Virtual Machine verhindert inlining Ihre Methoden, wenn die Leistung Ihren Code zu optimieren.

Für einen ganzen Artikel auf, warum finden Sie unter „ Release IS NOT Debug: 64-Bit-Optimierungen und C # Methode Inlining in Release Build-Call-Stacks “von Scott Hanselman

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