|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Nov 2002
Città: Morio Cho
Messaggi: 2598
|
Exception vs "return boolean"
Ciao,
mi chiedo se ci siano particolari considerazioni a favore di una strategia rispetto all'altra. Mi riferisco alle alternative: 1) nessun metodo restituisce void; piuttosto si restituisce un booleano e lo si controlla; 2) il metodo restituisce tranquillamente void, ma genera un'eccezione se fallisce. Cosa ne pensate? Sono sempre indeciso se adottare una strategia o l'altra... EDIT: mi riferisco in generale alla programmazione a oggetti
__________________
Sono GULDO, non Guido! Cioè, certo che guido... Bé, insomma, avete capito ![]() Linux 2.6.26|Debian|Debian@Hwupgrade|Debian Clan|Solo Puffin ti darà forza e grinta a volontà! NERD rank 62|Milla Jovovich|大事な物はいつも形の無い物だけ Sito e Forum sul Giappone|La mia libreria su aNobii Ultima modifica di guldo76 : 16-04-2009 alle 12:23. |
|
|
|
|
|
#2 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
devi rispettare il significato concettuale di valore di ritorno e di eccezione. evita di restituire un booleano solo per indicare una condizione di successo o di errore: il valore di ritorno é ció che la funzione deve calcolare, quindi se le fai restituire un booleano stai dicendo che quella funzione deve calcolare un booleano. io per indicare una condizione di errore uso sempre le eccezioni, sia in C++ sia in C# sia in Java (visto che non hai specificato il linguaggio).
tra l'altro in C++ lanciare un'eccezione spesso é piu efficiente: supponi di avere 5 chiamate annidate, 5 funzioni che si chiamano a catena e di cui l'ultima potrebbe fallire; inoltre supponi che la condizione d'errore debba essere semplicemente propagata e controllata solo "in cima", cio nella prima delle 5 funzioni. se le 5 funzioni ritornano un booleano che indica la condizione d'errore allora devi usare 4 if, uno dopo ciascuna chiamata, mentre se usi il meccanismo delle eccezioni il flusso di esecuzione salta direttamente a monte in caso di eccezione. naturalmente per far si' che la cosa sia realmente efficiente devi evitare la pessima abitudine di lanciare come eccezioni in C++ oggetti istanziati con new, altrimenti l'efficienza va a farsi benedire (per allocare nell'heap nel caso peggiore hai bisogno di uno switch in kernel mode, e comunque passi per tutta la trafila del CRT); piuttosto lancia un booleano: Codice:
void callee()
{
if (error_condition)
{
throw false;
}
}
void caller()
{
try
{
callee();
}
catch (bool error)
{
// ...
}
}
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Dipende da vari fattori decidere quale delle due usare... a mio parere delle linee guida sensate sono queste:
-interfaccia comune Se già usi ovunque uno dei due approcci è meglio usare sempre lo stesso per non spiazzare l'user -prestazioni try catch dicono siano più lenti, quindi in sezioni time-critical potrebbe essere meglio bool -probabilità di fallimento Se l'eccezione è comune, e fornisce dei dettagli che servono a risolverla (es file mancante) indubbiamente è meglio un'eccezione. -gravità dell'eccezione Se dopo l'eccezione il programma è del tutto compromesso forse ha poco senso proprio lanciarla, tanto il programma andrà chiuso lo stesso. -modo d'uso A volte un bool può essere più elegante di una eccezione, se il caso false è perfettamente contemplato: Codice:
if( device->createWindow() ) ... Cmq tutto ciò è del tutto IMHO |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Le eccezioni non sono un chè di particolare della programmazione orientata agli oggetti. Appartengono alla categoria delle condizioni nella teoria dei sistemi.
Anche un boolean può esprimere una condizione, da cui deriva l'incertezza. Se il linguaggio non ha una sintassi ad hoc per le eccezioni chiaramente uno è costretto ad usare dei valori di controllo. Se il linguaggio ha una sintassi ad hoc per le eccezioni allora uno DEVE usarle per la stessa ragione per cui al panettiere si chiede "uno sfilatino, grazie" e non "un cilindro, grazie". E' una questione di grammatica: se un fenomeno è identificabile con parole diverse si sceglie quella massimamente specifica. Dunque ogni volta che incontri una condizione che determina impedimento al conseguimento di uno scopo per una causa esterna al processo che deve raggiungerlo spari un'eccezione. In questo modo chi legge il codice sa che si è verificata una condizione che ha determinato impedimento... eccetera eccetera. |
|
|
|
|
|
#5 | ||||
|
Senior Member
Iscritto dal: Nov 2002
Città: Morio Cho
Messaggi: 2598
|
Quote:
Quote:
Cmq ora faccio così: catturo l'eccezione, scrivo un log e rilancio l'eccezione stessa. Quote:
Chiaramente se in un progetto si è sempre fatto in un certo modo, è opportuno continuare per la stessa strada, sicuramente. Quote:
Grazie mille
__________________
Sono GULDO, non Guido! Cioè, certo che guido... Bé, insomma, avete capito ![]() Linux 2.6.26|Debian|Debian@Hwupgrade|Debian Clan|Solo Puffin ti darà forza e grinta a volontà! NERD rank 62|Milla Jovovich|大事な物はいつも形の無い物だけ Sito e Forum sul Giappone|La mia libreria su aNobii |
||||
|
|
|
|
|
#6 | |||||
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
Quote:
Quote:
Quote:
Quote:
qui era decisamente meglio un'eccezione. |
|||||
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Nov 2002
Città: Morio Cho
Messaggi: 2598
|
Quote:
Provo semplicemente a connettermi: se riesco, OK, altrimenti genero un'eccezione (-> log) e fine del problema. No?
__________________
Sono GULDO, non Guido! Cioè, certo che guido... Bé, insomma, avete capito ![]() Linux 2.6.26|Debian|Debian@Hwupgrade|Debian Clan|Solo Puffin ti darà forza e grinta a volontà! NERD rank 62|Milla Jovovich|大事な物はいつも形の無い物だけ Sito e Forum sul Giappone|La mia libreria su aNobii |
|
|
|
|
|
|
#8 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Quote:
Io in Java ogni tanto uso una classe che mi permette di scrivere qualcosa tipo: Codice:
// pseudo-java
final Either<ExpectedResult, AnException> result = myFunction();
if (result.isRight()) {
// tutto ok qui ...
}
else {
// oh noooeesss...
}
...
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Quote:
Non parlerei tuttavia di condizione d'errore. L'errore è infatti un impedimento al raggiungimento dello scopo per causa interna. E' proprio il fatto che il verificarsi della condizione dipenda da un fattore esterno a determinarne la natura di eccezione. |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Nov 2002
Città: Morio Cho
Messaggi: 2598
|
Quote:
Diciamo che faccio qualcosa del genere (esempio semplificato): Codice:
static void Connetti(){
try{
...
...
...
}catch (Exception ex){
ScriviLog(ex.Message);
throw ex;
}
}
static void Main(){
try{
Connetti();
}catch {
ScriviLog("bla bla");
}
}
__________________
Sono GULDO, non Guido! Cioè, certo che guido... Bé, insomma, avete capito ![]() Linux 2.6.26|Debian|Debian@Hwupgrade|Debian Clan|Solo Puffin ti darà forza e grinta a volontà! NERD rank 62|Milla Jovovich|大事な物はいつも形の無い物だけ Sito e Forum sul Giappone|La mia libreria su aNobii |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Mica tanto... quante volte scrivi nel log? Una volta per ogni rethrow?
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Nov 2002
Città: Morio Cho
Messaggi: 2598
|
In linea di massima sì, per capire poi facilmente dal log in quale punto il programma è andato in errore. Cattiva idea? Come sarebbe meglio fare altrimenti?
__________________
Sono GULDO, non Guido! Cioè, certo che guido... Bé, insomma, avete capito ![]() Linux 2.6.26|Debian|Debian@Hwupgrade|Debian Clan|Solo Puffin ti darà forza e grinta a volontà! NERD rank 62|Milla Jovovich|大事な物はいつも形の無い物だけ Sito e Forum sul Giappone|La mia libreria su aNobii |
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Quote:
http://today.java.net/pub/a/today/20...ipatterns.html Guarda qual'è il primo degli anti-pattern
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
|
|
|
|
|
|
#15 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
*annuisce*
Quote:
|
|
|
|
|
|
|
#16 | ||
|
Senior Member
Iscritto dal: Nov 2002
Città: Morio Cho
Messaggi: 2598
|
Quote:
![]() Quote:
Quindi mi state dicendo piuttosto è meglio non catturare mai nessuna eccezione se non nel Main, in cui prendo lo stack trace e lo scrivo nel log?
__________________
Sono GULDO, non Guido! Cioè, certo che guido... Bé, insomma, avete capito ![]() Linux 2.6.26|Debian|Debian@Hwupgrade|Debian Clan|Solo Puffin ti darà forza e grinta a volontà! NERD rank 62|Milla Jovovich|大事な物はいつも形の無い物だけ Sito e Forum sul Giappone|La mia libreria su aNobii |
||
|
|
|
|
|
#17 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
se invece vogliamo parlare di Java la risposta diretta a questo thread é: non ritornare mai valori che indichino condizioni di errore o di successo, usare sempre le eccezioni per indicare condizioni di errore e che siano eccezioni checked per errori causati da fattori esterni (mancaza di connettivitá, files di inizializzazione non trovati, ecc.) e unchecked per bug del tuo programma (riferimenti nulli, index out of bounds, ecc.); per quanto riguarda la cattura delle eccezioni: quelle unchecked lasciale sempre propagare, quelle checked catturale nel punto del programma in cui é appropriato reagire alla condizione d'errore. i crash dump in quella cagata di Java ( ) purtroppo non esistono, in caso di eccezione unchecked lo sviluppatore dovrá accontentarsi dello stack trace che viene stampato automaticamente da Java su System.out quando un'eccezione esce fuori dal main o dal metodo run di un thread.per quanto riguarda infine C#, vale tutto come Java salvo che: - non esiste distinzione tra eccezioni checked e unchecked, quindi questa distinzione é affidata a te che devi discernere tra quando catturare un'eccezione nel tuo codice e quando lasciarla andare. - é possibile collezionare crash dump e caricarli nel debugger, ma purtroppo non ho idea di come si faccia. |
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Nov 2002
Città: Morio Cho
Messaggi: 2598
|
Grazie davvero per l'aiuto
Ma a questo punto mi chiedo: Supponiamo che io abbia un metodo Main (che non restituisce nulla) che al suo interno chiama un metodo Login (che non restituisce nulla). Supponiamo che la procedura di Login fallisca per problemi di connettività, ma all'interno del metodo io mi occupi di gestire questa eccezione (checked) e scrivere sul log, senza rifare il throw dell'eccezione. A questo punto, il Main che ha richiamato il Login, come viene messo al corrente della situazione?
__________________
Sono GULDO, non Guido! Cioè, certo che guido... Bé, insomma, avete capito ![]() Linux 2.6.26|Debian|Debian@Hwupgrade|Debian Clan|Solo Puffin ti darà forza e grinta a volontà! NERD rank 62|Milla Jovovich|大事な物はいつも形の無い物だけ Sito e Forum sul Giappone|La mia libreria su aNobii |
|
|
|
|
|
#19 | ||
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||
|
|
|
|
|
#20 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
mai visto un crash dump? mai provato a caricarlo in Visual Studio? é come fare il debug del programma al momento del crash: gli stack trace di ogni singolo thread sono il minimo.
Quote:
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:43.














) purtroppo non esistono, in caso di eccezione unchecked lo sviluppatore dovrá accontentarsi dello stack trace che viene stampato automaticamente da Java su System.out quando un'eccezione esce fuori dal main o dal metodo run di un thread.








