Newsgroup: it.comp.programmare.win32
Titolo: Eccezioni

Salve ragazzi! Procedendo nel mio corso di autoistruzione sul C++, sono
fermo al capitolo sulle eccezioni.
Grazie alle spiegazioni di Alex Martelli su it.comp.lang.c++ adesso so cosa
sono, e mi rivolgo a voi per sapere se, a cosa e come possono servire alla
programmazione sotto Win32 in particolare con MS VC++ 6.0 SP3 e applicazioni
MFC.
--
Kojak
vrke...@hotmail.com
http://space.tin.it/io/viscorci

 MFC.
Le MFC definiscono un piccolo numero di classi che 'gettano' (throw)
come eccezioni C++ in alcuni casi particolari; ad esempio, la classe
CFile, con vari suoi metodi puo`, in casi d'errore, fare il throw di
oggetti di tipo CFileException.
Devi quindi, a un qualche livello, rivestire di try/catch le tue funzioni
che fanno uso di questi metodi, per diagnosticare gli errori.  Puoi
anche farlo per singoli blocchi entro le funzioni, ma normalmente
ragionare sulla base di intere funzioni e` piu` semplice ed egualmente
efficace.
Piu` in generale, gli errori di programma (e alcuni guasti hardware)
su Win32 (soprattutto Win/NT) sono gestibili attraverso il "SEH"
(Structured Exception Handling) tipico appunto di Win32, ma il
modello e` un po' diverso da quello delle exception C++.  Vedi,
sull'MSDN:
Visual C++ Documentation
    Using Visual C++
        Visual C++ Programmer's Guide
            Adding ProgramFunctionality
                Details
                    Exception-Handling Topics
                        Mixing C and C++ Exceptions
Non puoi mescolare i due modelli entro una singola funzione,
ma puoi gestire le cosiddette "eccezioni C" (in realta`, SEH)
da un "catch" C++, con "catch(...)" o piu` potentemente
con _set_se_translator e una tua classe-wrapper.
Le SEH riguardano comportamenti del programma (o guasti
dell'hardware) per cui il C++ prevede "undefined behaviour",
come l'uso di variabili non inizializzate, il dereferencing di
puntatori nulli, la divisione per zero, eccetera. Quindi, sono
in generake errori che non puoi gestire su qualsiasi data
piattaforma, ma su Win32 (con un po' di fortuna) si`.
In C++, non hai bisogno del "termination handling" che
le SEH prevedono.  Le SEH offrono inoltre altri approcci
(come la possibilita` di _ignorare_ certi errori!) che in C++
non sono ammessi (e non servono davvero: se ti pare che
ti servano, meglio ripensare la struttura del tuo codice...).
Al posto del termination handling ecc, scrivi le cose in
modo che le 'azioni di terminazione' siano svolte nei
distruttori di tue opportune classi; questo e` l'approccio
C++ portabile, ed e` molto solido.  Il C++ Standard
gia` ti fornisce ad esempio il template auto_ptr<>, che
serve appunto proprio a questo (il suo distruttore ti
garantisce di liberare una certa risorsa -- specificamente,
di fare un delete di un certo puntatore che esso tiene).
Le MFC ti offrono altre classi che hanno un uso analogo,
cioe` implementano per te il paradigma "resource
acquisition is initialization" e piu` specificamente la
sua cruciale seconda meta` (cioe`, che la terminazione
si fa nel distruttore).  Vedi, ad esempio, CSingleLock.
Scrivere codice exception-safe non e` immediato, ma
e` una skill che si puo` benissimo imparare, ed uno
dei punti di forza del C++ per quel raro ma importante
tipo di applicazioni che ne hanno bisogno (cioe` le
applicazioni ad altissima affidabilita`, in grado persino
di cautelarsi in certa misura contro i guasti dell'hardware
su cui stanno girando... oltre che, contro gli effetti piu`
deleteri di certi errori di codifica in altre parti della stessa
applicazione, del sistema operativo, o di altre librerie e
componenti vari che l'applicazione possa richiedere).
Alex