Perché il resharper dice che 'La clausola di cattura con una singola istruzione' throw 'è ridondante'?

StackOverflow https://stackoverflow.com/questions/1019237

Domanda

Ho pensato di lanciare un'eccezione è una buona pratica per far tornare la bolla nell'interfaccia utente o da qualche parte in cui si registra l'eccezione e ne si avvisa l'utente.

Perché il resharper dice che è ridondante?

try
{
    File.Open("FileNotFound.txt", FileMode.Open);
}
catch
{
    throw;
}
È stato utile?

Soluzione

A causa

try {
    File.Open("FileNotFound.txt", FileMode.Open);
} catch {
    throw;
}

non è diverso da

File.Open("FileNotFound.txt", FileMode.Open);

Se la chiamata a File.Open (string, FileMode) fallisce, allora in entrambi gli esempi la stessa identica eccezione si troverà fino all'interfaccia utente.

Nella suddetta clausola catch , stai semplicemente catturando e rilanciando un'eccezione senza fare nient'altro, come la registrazione, il rollback di una transazione, il wrapping dell'eccezione per aggiungere ulteriori informazioni ad essa, o niente del genere.

Tuttavia,

try {
    File.Open("FileNotFound.txt", FileMode.Open);
} catch(Exception ex) {
    GetLogger().LogException(ex);
    throw;
}

non conterrebbe ridondanze e ReSharper non dovrebbe lamentarsi. Allo stesso modo,

try {
    File.Open("FileNotFound.txt", FileMode.Open);
} catch(Exception ex) {
    throw new MyApplicationException(
        "I'm sorry, but your preferences file could not be found.", ex);
}

non sarebbe ridondante.

Altri suggerimenti

Perché l'istruzione precedente ha lo stesso comportamento di se non fosse presente. Come per la scrittura:

File.Open("FileNotFound.txt", FileMode.Open);

Perché il codice nel tentativo sta già generando l'eccezione.

Vorresti catturare e rigettare l'eccezione solo se hai intenzione di fare qualcos'altro nel blocco catch oltre a rigettare l'eccezione.

Perché è ridondante.

Non hai eseguito alcuna elaborazione nel blocco catch, hai appena lanciato di nuovo l'eccezione.

Ti avverte perché non ha senso tentare ... di bloccare lì.

Inoltre, un altro buon consiglio è che "buttare ex" non conserverà la traccia dello stack ma "proietta" farà.

Vale la pena notare che mentre ...

try
{
    DoSomething();
}
catch
{
    throw;
}

... è ridondante, il seguente non è ...

try
{
    DoSomething();
}
catch (Exception ex)
{
    // Generally a very bad idea!
    throw ex;
}

Questo secondo frammento di codice è stato diffuso attraverso una base di codice che ho ereditato alcuni progetti fa e ha il brutto effetto di nascondere la traccia dello stack dell'eccezione originale. Lanciare l'eccezione che hai appena catturato in questo modo significa che la parte superiore della traccia dello stack si trova al livello lancio , senza menzione di DoSomething o qualsiasi altra chiamata al metodo nidificata effettivamente causata l'eccezione.

Codice di debug di buona fortuna che fa questo!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top