Domanda

Vi sono situazioni in cui si usa l'asserzione anziché la gestione delle eccezioni all'interno delle classi di dominio ...

È stato utile?

Soluzione

Utilizza le eccezioni per la convalida dei parametri e altri controlli che verificano che gli utenti delle tue classi li utilizzino come previsto.

Usa le asserzioni per i controlli di coerenza interni, vale a dire per indicare hai incasinato, non l'utente della tua classe.

Quindi, se gli utenti della tua classe vedono un errore di asserzione, sanno che è (probabilmente) un errore interno nel tuo codice, non nel loro uso del tuo codice. D'altra parte, se ottengono l'eccezione di convalida dei parametri, sanno che è colpa loro.

Altri suggerimenti

Mai. Le asserzioni non sono una forma valida di gestione degli errori. Usali per aiutare a identificare gli errori del programma durante il test.

Un'asserzione riflette uno stato che non dovrebbe mai verificarsi e che non era previsto, in cui l'applicazione non può continuare l'esecuzione per un motivo o per l'altro, mentre un'eccezione indica uno stato che non è considerato "normale", ma che non era inaspettato e da cui potrebbe essere possibile recuperare.

Ad esempio, se allocare spazio sull'heap e questa allocazione non riesce, non posso continuare a lavorare, quindi asserisco che l'indirizzo restituito è valido; dove non è valido, l'affermazione fallisce e il programma fallisce con essa.

D'altra parte, se apro un file per la lettura, e non esiste, allora potrebbe essere possibile recuperare dalla situazione, nel qual caso viene generata (e catturata e gestita un'eccezione) possibile).

In generale, le asserzioni sono più utili durante la fase di debug, mentre le eccezioni sono considerate parte del flusso regolare del programma e della gestione degli errori. Il consenso generale è che le asserzioni dovrebbero essere disabilitate nel codice di produzione (per proteggere gli utenti da apparenti arresti anomali), mentre ho letto una scuola di pensiero che sostiene che ciò è controproducente e che l'utente dovrebbe vedere il fallimento dell'asserzione, in modo che può segnalare correttamente il problema.

Personalmente, a volte unisco le due tecniche; di solito, se sto rilevando un'eccezione che non credo possa essere lanciata. Prendendo l'esempio sopra, se controllo l'esistenza del file prima di tentare di aprirlo, allora non mi aspetto che venga generata un'eccezione, e se lo è, tendo a occuparmene sollevando un'asserzione nel blocco catch pertinente. Trovo che questa sia una tecnica particolarmente utile in Java, dove tali eccezioni sono completamente controllate.

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