Newsgroup: it.comp.lang.c++
Titolo: Eccezioni VS Asserzioni....

Ciao a tutti,
quali sono le situazioni in cui è corretto usare le asserzioni piuttosto che
le eccezioni?
Io direi che le asserzioni vanno usate per i fallimenti delle precondizioni
dei metodi, cioè per gli errori che non *dovrebbero* capitare in una
corretta implementazione di un algoritmo.
Le eccezioni dovrebbero invece gestire "casi eccezionali" (ma che potrebbero
capitare anche nel codice formalmente corretto!).
Da questo punto di vista un errore nei parametri di chiamata di un metodo
dovrebbe far scattare un' asserzione, e non lanciare un' eccezione.
Però in un articolo di Chuk Allison ho letto che le asserzioni dovrebbero
essere usate solo per "asserire" cose di cui si è sicuri (e il caso di cui
sopra era citato come un esempio in cui lanciare un'eccezione).
Voi che dite?
GRAZIE
Daniele.

 wrote in message
news:gUpA6.13360$k53.2...@news1.tin.it...

Dipende da cosa intendi con asserzione!
L'uso della macro assert definita nell'header casser, a mio parere, non e'
consigliato. E' una di quelle cose che il C++ ha ereditato pedestriamente dal C.
In un environment non altrimenti personalizzato (per esempio sotto windows dove
esitono un sacco di macro per gestire vari tipi di check) o in generale quando
la cosa e' fattibile, io preferisco includere un header definito da me che, in
parole povere, definisce due assert che, con un pochino di "preprocessing sugar"
fanno questo:
- se sto compilando in maniera "release": dbgAssert non fa nulla, rtAssert
invece si comporta normalmente.
- se sto compilando in maniera "debug": dbgAssert e rtAssert fanno la stessa
cosa.
- se e' abilitato il supporto per le eccezioni: throw dell'eccezione
assertion_failed appositamente definita nello stesso header
- se non e' abilitato il supporto per le eccezioni: scrittura di un messaggio
direttamente all'handle di stderr (accesso a basso livello senza usare le
strutture del C++) e quindi abort del programma (in pratica lo stesso
comportamento della assert del c).
Ergo, dal mio punto di vista una assert non e' altro che un check definito con
una espressione booleana che fallisce se c'e' qualche cosa che non va. Cosa fare
in caso di fallimento e' semplice: il massimo possibile per risolvere il
problema a runtime e se non e' possibile per avere un comportamento sensato. Un
comportamento sensato, dal mio punto di vista, non e' uscire dall'applicazione
punto e basta. Piuttosto rilancia l'applicazione e ricarica l'ultimo stato che
sai essere stabile.
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

alla fine di ogni tuo post nei NG c'è questa scritta
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
Potresti spiegarmi di cosa si tratta? E' un corso che hai fatto?
Puoi dirmi cosa sono le varie voci che hanno vari valori (97%, 4.46 etc..)
Grazie
-- 
--
Luigi

 More info 
http://www.brainbench.com/transcript.jsp?pid=2522556
D'accordo che non c'e' un link alla home-page, ma non ci dovrebbe essere bisogno
di fare corsi speciali per provare a guardare su 
http://www.brainbench.com
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

 
-- 
--
Luigi


Si tratta di test. E conseguente certificazione. Ma tutto in inglese. Quindi non
ha senso che te ne interessi fino a che non hai studiato l'inglese o loro non
hanno deciso di tradurre tutto in italiano. La seconda ipotesi e' la meno
probabile!
--


Ma si fanno on-line?
E la certificazione la spediscono a casa? Oppure tutto a casa e poi tu
spedisci... insomma per corrispondenza?
Siccome siamo spaventosamente OT puoi rispondermi all'indirizzo
byte...@hotmail.com
Grazie
Luigi
-- 
Posted from 
smtp1.libero.it
 [193.70.192.51] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG