2013-02-12 10 views
7

Al mio lavoro devo mantenere alcuni progetti C#. Lo sviluppatore originale non è più in giro. Ultimamente ho notato un po 'strano codice per lo più si trovano in situazioni come questa:Strana eccezione Gestione manichino istruzione

try 
{ 
    //some Code 
} 
catch 
{ 
    0.ToString(); 
} 

Qual è il 0.ToString() per? La maggior parte del codice è stato scritto sotto stress, così posso pensare a due possibilità:

  • Si tratta di un segnaposto (come //TODO), per i quali possono essere cercati per sapere dove avete per risolvere alcune cose.
  • È per evitare avvisi durante la compilazione di clausole di cattura vuote.

C'è qualche altro usecase o senso in questo? Questo stile o pratica di codifica buono/cattivo? Dal momento che questa istruzione non fa nulla, avrà un piccolo impatto sulle prestazioni o il compilatore lo rimuoverà? Quali sono i modi migliori per fare qualcosa come

+7

L'unico motivo logico sarebbe avere un codice lì in modo da poter impostare un punto di interruzione per l'eccezione che viene lanciata, anche se non è un buon modo per farlo; p – leppie

+0

Sto supponendo che O sia un 'oggetto' con' valore null' e c'è un punto di interruzione per 'NullReferenceException' –

+0

Suoni come il programmatore originale avrebbe dovuto scrivere alcuni test ... Quel detentore del debug breakpoint sta soffocando anche eventuali eccezioni ... –

risposta

2

Come suggeriscono i commenti, il codice di esempio contiene una cosa strana e una cosa negativa. Il

0.ToString(); 

è quasi sicuramente così che esiste una riga di codice in cui un debugger può posizionare un punto di interruzione. Questa è una delle linee più strane che ho visto usate per questo scopo. È probabile che questa riga sia stata eseguita inavvertitamente dopo una sessione di debug.

Separato da quello è il blocco vuoto catch, che in genere non è una buona idea. Ryan Gates dà una risposta eccellente per questo, quindi non ho intenzione di espandermi su questo punto. Ma la cosa ironica è che se ci fosse un blocco di catch adeguato, ci sarebbe una linea di codice su cui collocare un breakpoint.

1

No, non esiste un altro caso o motivo ragionevole per farlo. È una cattiva pratica di codifica. Il tuo codice non dovrebbe rilevare alcuna eccezione che non può gestire.

Il percorso migliore è quello di rimuoverlo. Quando viene lanciata un'eccezione, è necessario comprendere questo caso. Quindi, solo a questo punto è possibile aggiungere i controlli appropriati e/o il codice di gestione delle eccezioni specifico.

Il codice in questione è un esempio di swallowing the exception, which is hazardous to your health.