2009-12-11 17 views
9

ho una try e catch dove sto cattura di diversi tipi di errore:C Valore # viene dichiarata ma mai usato

catch (XmlException XmlExp) 
{ 
    return false; 
} 

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

noti che XmlException XMLExp viene dichiarata ma mai utilizzato. È possibile intercettare XMLException senza dichiarare una variabile locale?

È questo il codice valido:

catch (XmlException) 
{ 
    return false; 
} 
+3

Avete mai cercare di rimuovere 'XmlSchExp' testo (niente altro)? Provare. :) –

+11

sul serio, provaci! ci vuole meno tempo rispetto alla pubblicazione della domanda. inoltre, basta usare 'throw;' invece di 'gettare GenExp;' il tuo intento è di rilanciare l'eccezione –

+2

Inoltre è una cattiva idea gettare un'eccezione nel catch catch: 'getta GenExp;'. Perderai la traccia dello stack. Basta scrivere 'gettare'; per rilanciare un'eccezione catturata. –

risposta

17

Sì, come questo

catch (XmlException) 
{ 
    return false; 
} 

catch (XmlSchemaException) 
{ 
    return false; 
} 

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

Troppo veloce! lol. – James

+14

Usa catch (Exception) {throw} al posto. Ciò mantiene corrette le informazioni stracktrace. Ripetendo l'eccezione distruggi lo stacktrace originale –

+3

@Sander - o ometti quel blocco di cattura del tutto solo se è appena retrocesso – philsquared

2

Sì. Basta perdere il nome della variabile:

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

basta omettere il nome della variabile. Per l'ultima ripresa, consiglierei di utilizzare throw; anziché throw GenExp, poiché quest'ultimo perde lo stack di chiamate. Anche se non stai facendo nulla di più di un rethrow, devi solo omettere l'intero blocco catch.

5

Basta usare

catch (XmlException) 
{ 
    throw; 
} 

Quando si lancia un oggetto eccezione specifico come throw ex l'analisi dello stack viene sovrascritto.

1

Sì, è possibile:

catch (XmlException) 
{ 
    return false; 
} 

Naturalmente, si applicano tutte le altre norme in materia di eccezioni - non li vale a dire utilizzando per il controllo di flusso, evitando eventuali situazioni in cui potrebbero essere gettati, ecc

6

Fate questo

catch (XmlException) 
{ 
    return false; 
} 

catch (XmlSchemaException) 
{ 
    return false; 
} 

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

È anche codice valido e cattura tutte le eccezioni.

0

Avviso importante!

Si tratta di uno stile di programmazione estremamente BAD - all'uso di costruzioni simili:

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

Vuol dire, che lo stack eccezione inizierà con questo punto (dello stack), e si può perdere qualsiasi stack frame, che sono inferiori a questo punto.

corretta:

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

1- Penso che si doveva fare questo da soli.

2- catch (XmlException) // valido { return false; } catch (XmlSchemaException) // valido { return false; } catch (Exception GenExp)
{ throw GenExp; }
// valido, ma non ha senso, perché l'eccezione accadrà e non c'è alcun blocco catch try a handel esso

Problemi correlati