Hum ... bad news ;-) ... Thanks a lot for the reply Selon "Young, Michael" <Michael.Young@xxxxxxxxxx>: > I believe this is a C++ issue, not a G++ compiler issue. > From the C++ standard (ISO 14882 15.1 P3) : > > "A throw-expression initializes a temporary object, the type of which is > determined by removing any top-level cv-qualifiers from the static type > of the operand of throw and adjusting the type from "array of T" or > "function returning T" to "pointer to T" or "pointer to function returning > T", respectively." > > Note that the type thrown is the *static* (not dynamic) type of the operand > to the throw statement. In your example, this is the static type of excp > (which is ErrorBase, per the parameter definition) in the throw_exception > function. > > So, this is indeed "normal (standard compliant)" (if not your desired) > behavior. > > Laurent Marzullo writes : > > > > Hello, > > > > Here a little program. > > > > #include <iostream> > > > > class ErrorBase {} > > class Error : public ErrorBase {} > > > > void > > throw_exception( const ErrorBase& excp ) > > { > > throw excp; > > } > > > > > > void > > function( void ) > > { > > Error a; > > throw_exception( a ); > > } > > > > int > > main( void ) > > { > > try > > { > > function(); > > } > > catch ( const Error& err ) > > { > > std::cerr << "Error\n"; > > } > > catch ( const ErrorBase& err ) > > { > > std::cerr << "ErrorBase\n"; > > } > > catch ( ... ) > > { > > std::cerr << "Unknown exception !\n"; > > } > > } > > > > > > This program call a function which throw an exception of type 'Error' > (which > > inherite from 'ErrorBase'). > > > > But the catch bloc only catch ErrorBase exception and not Error ? > > Is it a normal behavior ? > > I know that there's a copy of the object when a throw occur but is it not a > copy > > of the real type of the object that must happen ? > > > > I want my function throw_exception to throw the real type of the object > passed > > as parameter. How may I achieve this ? > > > > May I dynamic_cast to all possible exception that must be passed to > > throw_exception as: > > > > if ( dynamic_cast<const Error*>( &excp ) != 0 ) > > throw Error(); > > else > > throw excp; > > > > > > Any hint, help ?? > > > > +--------------------+ + Laurent Marzullo +