Re: Exception information in catch(...) statement
On Sep 1, 12:22 pm, Zeppe
<ze...@remove.all.this.long.comment.yahoo.it> wrote:
Bernie wrote:
Hi
is it possible to receive information like type of exception (division =
by
zero/null pointer/...), memory adress or source line number in a catch(=
....)
statement?
no, you can't. In order to have information on a specific type of
exception, you have to catch it explicitely with catch(ExceptionClass&
exc), for source line number the only way to get it is through a macro,
and I'm not aware of any mechanism to retrieve memory address information=
..
Right. You must encode any information you want to retrieve in the
exception at the throw point. That can include filename/line number
and anything else. If you've caught by "...", you can rethrow and try
to catch more specifically:
class MyException : public std::exception
{
const char* file_;
const int line_;
const char* desc_;
public:
MyException( const char* file, const int line, const char* desc )
: file_( file ), line_( line ), desc_( desc )
{}
const char* GetFile() const { return file_; }
int GetLine() const { return line_; }
const char* GetDesc() const { return desc_; }
virtual const char* what() const { return desc_; }
};
// ...
try
{
// ...
throw MyException( __FILE__, __LINE__, "Something bad happened" );
}
catch( ... )
{
try
{
throw; // rethrow
}
catch( const MyException& e )
{
std::cerr << "Exception at " << e.GetFile() << ':'
<< e.GetLine() << ':' << e.GetDesc() << '\n';
}
catch( const std::bad_alloc& )
{
std::cerr << "Memory allocation error.\n"
}
catch( const std::exception& e )
{
std::cerr << "Exception: " << e.what() << '\n';
}
catch( ... )
{
std::cerr << "Unknown exception caught.\n";
}
}
Rethrowing like this is helpful for using the same error handling code
everywhere without having to supply all the catch blocks each time.
Unlike .NET and Java, for instance, standard C++ does not carry around
a stack trace or anything of that sort, as that would be expensive and
would often be unnecessary/undesirable. Efficiency is preferred run-
time debugability.
Cheers! --M