|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#41 | |
|
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
Quote:
|
|
|
|
|
|
|
#42 | ||
|
Senior Member
Iscritto dal: Dec 2001
Messaggi: 428
|
x cionci
Quote:
Quello che poni non e' un problema delle eccezioni ma e' un problema di cattiva gestione dell'errore. Infatti se il chiamante deve capire esattamente cosa e' successo dobbiamo fare il throw di eccezini diverse oppure tornare numeretti diversi nel caso C. Quote:
__________________
PC: Phenom 2 955, 4 GB RAM DDR3, 2 x ATI HD 7870 Ghz edition |
||
|
|
|
|
|
#43 | |
|
Senior Member
Iscritto dal: Dec 2001
Messaggi: 428
|
Quote:
Sistemi che usano le eccezioni per l'error handling tendono a definire parecchie eccezioni (il sistema che sto sviluppando al momento attuale consta di circa 200.000 righe di codice e ci sono una trentina di eccezioni). Non e' detto che per ogni errore bisogna avere una eccezione diversa: per esempio un errore di lettura / scrittura / apertura / chiusura di un file si puo' reppresentare ad esempio con FileSystemException e dentro si puo mettere una stringa che da' un informazione dettagliata di cosa e' successo. Secondo me avete una idea sbagliata della gestione delle eccezioni: le eccezioni non si devono catturare quasi mai, ha senso farlo solo se dobbiamo effettuare delle azioni di recovery, altrimenti le possiamo bellamente ignorare. Infatti provedono loro a terminare la funzione da cui e' saltata fuori l'eccezione e tutti i chiamanti finche' non arriviamo a un chiamante che deve prendere la contromisura all'errore che gli e' tornato. Un codice che usa l'approccio C tende a essere cosi': .... int ret_code = 0; ret_code = f1(); if (ret_code == E_ERROR_CODE) { return E_ERROR_CODE; } ret_code = f2(); if (ret_code == E_ERROR_CODE) { return E_ERROR_CODE; } ret_code = f3(); if (ret_code == E_ERROR_CODE) { return E_ERROR_CODE; } .... un codice che usa le eccezioni tende a essere cosi: ..... f1(); f2(); f3(); .... Non c'e' paragone no?
__________________
PC: Phenom 2 955, 4 GB RAM DDR3, 2 x ATI HD 7870 Ghz edition |
|
|
|
|
|
|
#44 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Quote:
if (f1() == E_ERROR_CODE) Disconnetti(); if (f2() == E_ERROR_CODE) PincoPallino(); if (f3() == E_ERROR_CODE) TizioCaio(); Ma che stai scrivendo con 200.000 linee ? |
||
|
|
|
|
|
#45 | |
|
Senior Member
Iscritto dal: Dec 2001
Messaggi: 428
|
Quote:
In questo caso ovviamente bisognerebbe avere un try/catch per ogni chiamata. Pero' il caso che proponi a me non capita quasi mai, perche' generalmente se qualcosa va' storto le operazioni di recovery le fanno i distruttori di oggetti creati lungo la sequenza di oparazioni. Es: RemoteConnection conn(hostname, port); // il costruttore si connette a un server remoto e lancia eccezione se qualcosa va' storto. Il distruttore si disconnette. DB_Connection db_conn(db_name, username, passwd); // come sopra ma a un RDBMS Results query_results; // oggetto che contiene i risultati della query. Il distruttore dealloca la memoria db_conn.executeSomeQuery(query_results); // query_results viene riempito con i risultati della query. Lancia eccezione se qualcosa va male conn.sendData(query_results); // per esempio i dati vengono mandati al server remoto. Lancia eccezione se qualcosa va storto. Questo codice e' exception safe senza nessun try/catch e senza nessun ramo di codice di error handling! Fallo con un approccio classico e ti rendi conto di quanto codice noioso e error prone avresti dovuto scrivere. Convinto?
__________________
PC: Phenom 2 955, 4 GB RAM DDR3, 2 x ATI HD 7870 Ghz edition |
|
|
|
|
|
|
#46 | |
|
Senior Member
Iscritto dal: Dec 2001
Messaggi: 428
|
Quote:
__________________
PC: Phenom 2 955, 4 GB RAM DDR3, 2 x ATI HD 7870 Ghz edition |
|
|
|
|
|
|
#47 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Sì ok...nel codice che hai proposto te lo userei anche io il sistema ad eccezioni...ma non si può generalizzare...
|
|
|
|
|
|
#48 |
|
Senior Member
Iscritto dal: Dec 2001
Messaggi: 428
|
x cionci
Certo non sempre le cose sono cosi eleganti, ma basta fare l'abotudine a questo modo di scrivere e poi vedrai che i casi che non possono ridursi a questo schema sono veramente pochi.
Ciao.
__________________
PC: Phenom 2 955, 4 GB RAM DDR3, 2 x ATI HD 7870 Ghz edition |
|
|
|
|
|
#49 |
|
Senior Member
Iscritto dal: Dec 2001
Messaggi: 428
|
abitudine!!!
__________________
PC: Phenom 2 955, 4 GB RAM DDR3, 2 x ATI HD 7870 Ghz edition |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 02:19.



















