2009-12-11 19 views
9

Ich habe einen Versuch und Fang, wo ich verschiedene Fehlertypen am Fang:C# Wert wird deklariert, aber nie verwendet

catch (XmlException XmlExp) 
{ 
    return false; 
} 

catch (XmlSchemaException XmlSchExp) 
{ 
    return false; 
} 
catch (Exception GenExp) 
{ 
    throw GenExp; 
} 

Beachten Sie, dass XMLException XMLExp deklariert, aber nie verwendet. Ist es möglich, die XMLException abzufangen, ohne eine lokale Variable zu deklarieren?

Ist der gültige Code:

catch (XmlException) 
{ 
    return false; 
} 
+3

Haben Sie jemals versucht 'XmlSchExp' Text (nichts anderes) zu entfernen? Versuchen. :) –

+11

ernst, versuche es einfach! Es dauert weniger Zeit als die Frage zu posten. Verwenden Sie auch 'throw;' anstelle von 'werfen GenExp;' ist Ihre Absicht ist, die Ausnahme erneut zu lösen –

+2

Es ist auch eine schlechte Idee, Ausnahme innerhalb catch-Block zu werfen: 'werfen GenExp;'. Sie werden Stapelverfolgung verlieren. Schreib einfach 'werfen'; um eine gefangene Ausnahme zu wiederholen. –

Antwort

17

Ja, wie diese

catch (XmlException) 
{ 
    return false; 
} 

catch (XmlSchemaException) 
{ 
    return false; 
} 

catch (Exception GenExp) 
{ 
    // inspect or use GenExp 
    throw; 
} 
+0

Zu schnell! lol. – James

+14

Verwenden Sie stattdessen catch (Exception) {throw}. Dies hält die Stracktrace-Information korrekt. Wiederholt man die Ausnahme, wird der ursprüngliche Stacktrace zerstört –

+3

@Sander - oder einfach den gesamten Catch-Block weglassen, wenn er gerade neu gestartet wird. – philsquared

2

Ja. Verpassen Sie einfach die Variablennamen aus:

catch (XmlException) 
{ 
    return false; 
} 
0
catch (XmlException) 
{ 
    return false; 
} 
catch (XmlSchemaException) 
{ 
    return false; 
} 
catch (Exception GenExp) 
{ 
    throw GenExp; 
} 

nur die Variablennamen weglassen. Für den letzten Fang würde ich empfehlen throw; anstelle von zu verwenden - da letzterer den Call-Stack verliert. Obwohl, wenn Sie wirklich nichts weiter tun als einen erneuten Durchlauf, dann lassen Sie einfach den ganzen Catch-Block weg.

5

Verwenden Sie einfach

catch (XmlException) 
{ 
    throw; 
} 

Wenn Sie bekommt ein bestimmtes Ausnahmeobjekt wie throw ex der Stack-Trace überschreibt werfen.

1

Ja, Sie können:

catch (XmlException) 
{ 
    return false; 
} 

Natürlich sind auch alle anderen Regeln für Ausnahmen gelten - also nicht mit ihnen für die Ablaufsteuerung, alle Situationen zu vermeiden, wo sie geworfen werden könnten, usw.

6

dies tun

catch (XmlException) 
{ 
    return false; 
} 

catch (XmlSchemaException) 
{ 
    return false; 
} 

catch (Exception) 
{ 
    throw; 
} 
0
catch (Exception unknownException) 
{ 
    throw new Exception("Unknown error.", unknownException); 
} 
0
catch 
{} 

Ist auch gültiger Code und fängt alle Ausnahmen ab.

0

Wichtiger Hinweis!

Es ist eine extrem schlechte Programmierung Stil ist - von ähnlichen Konstruktionen zu verwenden:

try 
{ 
    // smth 
} 
catch(IOException e) 
{ 
    throw e; 
} 

Es bedeutet, dass die Ausnahme-Stack mit diesem Punkt (Stack) beginnen, und Sie können alle Stack-Frames verlieren, welche sind niedriger als dieser Punkt.

Richtig:

try 
    { 
     //smth 
    } 
    catch(IOException e) 
    { 
     throw; 
    } 
0

1- Ich glaube, Sie sollte dies selbst tun.

2- catch (XmlException) // gültig { return false; } catch (XmlSchemaException) // gültig { Rückgabe false; } catch (Ausnahme GenExp)
{ werfen GenExp; }
// gültig, aber nicht sinnvoll, weil die Ausnahme passiert, und es gibt keinen Versuch catch-Block es zum handel

Verwandte Themen