Domanda

Recentemente ho fatto la dichiarazione a un collega che:

  

NullReferenceExceptions dovrebbe non   essere esplicitamente catturato

Ho usato la parola mai .... hmmm. Non ho mai visto un caso d'uso appropriato me stesso per catturarli, ma ho voluto verificare se qualcun altro ha?

Non è una parola così forte dopo tutto .....

È stato utile?

Soluzione

Dipende perché; vedi di Eric Lippert blog . Se sono "eccezioni boneheaded", allora no - basta fissare il codice chiamante. Nel raro caso che essi sono "eccezioni irritante" (vale a dire il codice che si sta chiamando ha trappole che sono difficili da evitare), allora credo che avrei dovuto.

Altri suggerimenti

Bene, quando si chiama in una libreria di terze parti buggy che provoca ocasionnaly nullrefs, è probabilmente una buona idea per la cattura di loro se si sa come trattare correttamente con loro.

esempio della vita reale: In passato, ho usato abbastanza estesamente un datagrid fornito da un editor di terze parti. Hanno (o ha avuto in questo momento) un bug confermato che whould gettare un nullref (annidata nel profondo del loro stack di chiamate) di tanto in tempi in cui l'aggiornamento dei dati nell'origine dati sottostante.

ho affrontato la situazione con questo codice:

            try
            {
                // do the update
            }
            catch (NullReferenceException)
            {
                try
                {
                    // redo the update
                }
                catch (NullReferenceException ex)
                {
                    // properly log the third party lib failure
                }
            }

A proposito, il mio codice "log" non ha mai eseguito in 2 anni :) Ora l'editor terzo ha risolto il problema, e probabilmente dovrebbe rimuovere questo codice.

Forse la citazione corretta è

  

NullReferenceExceptions dovrebbe mai   essere esplicitamente catturato se si possiede la   codice che generata l'eccezione

Hai ragione, "mai" è una parola forte.

La cattura di un NullReferenceException (o un NPE per Java), dipenderà sempre dallo scopo del codice.

Per esempio, se l'applicazione richiede che il trattamento continuerà anche con lo stato potenzialmente incerta (si pensi sistemi di supporto alla vita) o se il codice non si preoccupa dello stato dell'oggetto di riferimento (es: dati elaborazione batch che butta fuori, letteralmente , dati non validi).

E 'una buona regola di non prendere questi tipi di eccezioni, ma non una legge.

Non direi mai. Per esempio si potrebbe prenderlo per registrare l'eccezione o di maresciallo da un thread ad un altro. In entrambi i casi l'eccezione dovrebbe essere gettare di nuovo.

Come Marc Gravell sottolinea Eric Lippert ha un'ottima voce sul suo blog su eccezioni.

Una volta ho dovuto costruire una grande stringa in base ai valori di 15 o giù di lì variabili. Invece di controllare ciascuno per nullness, ho semplicemente andato su e ha creato la corda, dereferenziazione le variabili, e prendere il NRE. Ad essere onesti è sentita male e cattivo, ma mi ha salvato da scrivere un sacco di codice.

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