2010-02-05 15 views
7

In .NET, le firme dei metodi non mi dicono se ho dimenticato di gestire alcune eccezioni che potrebbero essere generate dal mio codice. C'è qualche strumento che può avvisarmi, se dico che sto usando una HashTable remove ma non ho gestito l'ArgumentNullException? Non voglio essere sorpreso in fase di esecuzione.Come faccio a sapere se non ho gestito alcune eccezioni non controllate che il mio codice .NET potrebbe generare?

E questo significa che è necessario conoscere il codice molto bene, altrimenti le eccezioni non controllate possono essere più difficili da utilizzare?

risposta

4

In realtà, gestire le eccezioni impreviste terminando il programma è il modo migliore per gestire questa situazione, poiché, in generale, lo stato del programma non è definito quando accade qualcosa di inaspettato. Se si registrano tutte le eccezioni e si dispone di una serie accettabile di test di accettazione, è possibile eliminare i problemi derivanti da eccezioni impreviste dovute al flusso del programma.

La programmazione difensiva controllando gli input del metodo, i test unitari delle classi e la comprensione del framework renderanno possibili le eccezioni.

1

Non esiste supporto linguistico per ciò che si sta tentando di realizzare. Abbiamo scritto un add-on doganale su VS per assicurarci che tutti i punti di ingresso per la nostra API avessero provato i fermi per la registrazione. Tuttavia non ho mai visto il valore dei linguaggi che ti ha costretto a coprire tutti i possibili casi di eccezione dichiarati, dal momento che devi ancora scrivere del codice per fare qualcosa di significativo con l'errore. La maggior parte delle persone guarda solo ciò che il compilatore si lamenta di scrivere un gestore e nascondere quello che potrebbe essere un errore utile in qualche codice inutile. In alcuni casi è meglio fallire e sapere che c'è un problema.

+0

Sono d'accordo che è una brutta cosa per catturare solo le eccezioni e non usarlo correttamente per prendere una decisione per come si programma deve reagire è pessimo, è come in VB6 per dire semplicemente "On Error Resume Next". – awe

1

È necessario aggiungere il gestore di eccezioni di livello più alto per l'applicazione e scrivere test di unità, funzionali e di integrazione per la propria app, che verificherà tutti i possibili casi d'uso. Questo ti aiuterà ad eliminare quasi tutte le eccezioni non controllate.

Prova anche a non rilevare le eccezioni, ma elimina il motivo. (Cioè non prendere ArgumentNullException ma non passando null

2

per le applicazioni Windows:

AppDomain currentDomain = default(AppDomain); 
currentDomain = AppDomain.CurrentDomain; 
// Handler for unhandled exceptions. 
currentDomain.UnhandledException += UnhandledExceptionHandler; 
// Handler for exceptions in threads behind forms. 
Application.ThreadException += ThreadExceptionHandler; 

public static void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs e) 
{ 
} 

public static void ThreadExceptionHandler(object sender, Threading.ThreadExceptionEventArgs e) 
{ 
} 
+0

@Aseem: Non sono sicuro di averlo capito .. Quindi tutte le eccezioni non gestite e relative ai thread verranno qui nel caso in cui non le ho gestite, e fornisce un po 'di sicurezza .. è questo il tuo intento qui? –

+0

Sì ... Puoi quindi decidere cosa fare con queste eccezioni. –

Problemi correlati