Newsgroup: it.comp.lang.c++
Titolo: try-block in un costruttore

Ho provato a compilare il seguente programma con il BCC 5.5
#include <vector>
class X
{
  private:
    std::vector<int> v;
  public:
    X(int);
    // ...
};
X::X(int s)
try  : v(s)
{
  // ...
}
catch(...)
{
  // ...
}
La sintassi non è riconosciuta.
Alla Borland si vantano del loro supporto allo Standard e poi si scordano una cosa
del genere?
(Oppure sono io che sbaglio sintassi?)
Peccato, mi serviva questa cosa per un mio programma.
Manlio Perillo

Mi sa che effettivamente e' il compilatore, perche' la sintassi e'
corretta. Il function try block mi pare comunque una funzionalita' di
utilita' marginale, perche' ho letto da qualche parte che di fatto
l'unica utilita' pratica e' per cambiare il tipo di eccezione lanciata.
Ciao,
Nicola



Questo è da vedere, proprio oggi sto tappezzando il mio programma di
try-catch sulle chiamate DCOM perchè in nessun caso si deve bloccare,
ma deve comunicare che tipo di errore e dove si è verificato... E poi
'ripartire' in modo pulito.
Ciao, Luc.


Infatti è a questo che mi serviva.
Volevo mappare una eccezione in un'altra.
Manlio Perillo

Direi che stiamo parlando di cose diverse. Il "function try block" e'
l'unico meccanismo che permette di intercettare all'interno di un
costruttore eventuali eccezioni lanciate dai costruttori di
sotto-oggetti o di classi base.
Poiche' in tale situazione la costruzione dell'oggetto in questione e'
stata abortita l'unico utilizzo sicuro del function try block e'
lanciare un'eccezione diversa da quella intercettata:
struct A {
  A(int a) { if ( a < 0 ) throw -1; }
};
struct B {
  B(int b) try a(b) {} catch ( int i ) { throw -i }
  A a;
};
Nota che il try e' all'esterno del corpo del costruttore.
I blocchi try/catch convenzionali (all'interno delle funzioni) sono
perfettamente supportati dal BCC 5.5 .
Ciao,
Nicola

}
A giudicare dal draft la cosa dovrebbe essere permessa ma non
vengono fatti esempi specifici.
Ci sono alcuni dubbi che mi vengno al riguardo.
Innanzitutto che tipo di codice e' ammesso all'interno del
blocco di catch ? In fondo si e' generata una exception da qualche
parte (forse prima dell'inizializzazione di qualcuno dei membri)
e quindi *this non e' stato costruito (non e' stata nemmeno
completata la costruzione delle basi per esempio).
Io direi che in questo caso qualunque riferimento di qualunque
tipo che riguardi membri non statici della classe non dovrebbe
essere permessa.
Ho inoltre un altro dubbio. Supponiamo che il blocco di catch
non termini con una throw; cosa dovrebbe fare il compilatore ?
Considerare l'oggetto costruito oppure no ? Ci sono implicazioni
importanti se per esempio questo classe e' usata come membro
in un'altra o se viene allocata sullo free store.
Non vedo problemi per eventuali exception all'interno del corpo
del costruttore; in questo caso per lo meno l'oggetto e' stato
costruito nelle sue parti fondamentali (membri, basi, VMT e
RTTI se presente). Ma queste exception puoi intercettarle con
un try interno al corpo del costruttore.
La sintassi try function con i costruttori mi lascia molto
perplesso.
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

In effetti l'unico utilizzo sensato e' tradurre un'eccezione
intercettata con un'altra.
Ciao,
Nicola

 non termini con una throw; cosa dovrebbe fare il compilatore ?
Lanciare di nuovo l'eccezione originale.
Non e' possibile uscire dal constructor try-block senza lanciare
un'eccezione.  Se si raggiunge la fine del blocco senza averne
lanciata una esplicitamente, viene automaticamente rilanciata
quella originale.
Questo argomento e' stato discusso nel "Guru of the Week #66",
disponibile all'indirizzo 
http://www.peerdirect.com/resources/
	Mauro

quella originale.
Ringrazio per la risposta. Dopo aver consultato il link che mi
hai dato ho trovato un riferimento nello standard alla
descrizione di cosa succede ai membri gia' costruiti in quel
caso. Io avevo cercato la cosa senza fortuna... (nel draft)
pero' cercavo nel posto sbagliato (nei costruttori invece che
nelle exception).
Dalle frasi citate nel GoW #66 ho notato che questa e' una
delle cose che e' stata specificata meglio nello standard
rispetto al draft che ho (sul draft ad esempio non e'
esplicitato che riferimenti a membri non static sono vietati)
Mi sa che dovro' pagare questi benedetti 18 dollari (non e'
un problema per la cifra... - ho speso 10 volte tanto solo
l'anno scorso in libri da Amazon - pero' mi da un po'
fastidio che lo standard C++ sia consultabile solo
a pagamento...)
Grazie ancora
