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