what() 未打印的重新抛出异常的自定义错误消息
Custom error message of re-thrown exception not printed by what()
我正在编写一组扩展 std::exception
的自定义异常。在某些代码中,当异常被捕获时,我只是重新 throw
它向上链直到驱动程序 main
函数调用 catch
es 并打印结果。然而,最终打印出来的是 "std::exception"。这似乎不是我之前处理的 scope issue。
为什么我的异常消息没有打印出来?
我的异常代码:
// General exception class
struct MyException : public std::exception
{
std::string _msg;
MyException(const std::string &exception_name) : _msg(exception_name) {}
void setMessage(const std::string &message)
{
_msg += ": " + message + "\n";
}
void setLocation(const char * func, const char * file, const int line)
{
_msg += " In function " + std::string(func) + "(" + file + ":" + std::to_string(line) + ")";
}
const char * what() const throw()
{
return _msg.c_str();
}
};
// Specializations of the MyException
struct FileNotFoundException : public MyException
{
FileNotFoundException() : MyException("FileNotFoundException") {}
};
struct IOException : public MyException
{
IOException() : MyException("IOException") {}
};
struct DBException : public MyException
{
DBException() : MyException("DBException") {}
};
我所有的异常抛出都包含在这个宏中
#define EXCEPTION_THROWER(ET, message) \
{ \
ET e; \
e.setMessage(message); \
e.setLocation(__func__, __FILE__, __LINE__); \
throw e; \
}
并称为
EXCEPTION_THROWER(DBException, "Blah blah database exception")
中间 try/catch 块看起来像这样:
try
{
// Call a function that throws an exception
}
catch(const std::exception &e)
{
throw e; // Forward any exceptions
}
并且驱动程序代码全部在一个 try
块和一个 catch (const std::exception &e)
块中。
throw e;
正在执行 object slicing 的桶负载,因为它本质上是将 e
的内容切片到 std::exception
(并且 _msg
将丢失)。
使用throw;
重新抛出捕获的异常通过引用。
我正在编写一组扩展 std::exception
的自定义异常。在某些代码中,当异常被捕获时,我只是重新 throw
它向上链直到驱动程序 main
函数调用 catch
es 并打印结果。然而,最终打印出来的是 "std::exception"。这似乎不是我之前处理的 scope issue。
为什么我的异常消息没有打印出来?
我的异常代码:
// General exception class
struct MyException : public std::exception
{
std::string _msg;
MyException(const std::string &exception_name) : _msg(exception_name) {}
void setMessage(const std::string &message)
{
_msg += ": " + message + "\n";
}
void setLocation(const char * func, const char * file, const int line)
{
_msg += " In function " + std::string(func) + "(" + file + ":" + std::to_string(line) + ")";
}
const char * what() const throw()
{
return _msg.c_str();
}
};
// Specializations of the MyException
struct FileNotFoundException : public MyException
{
FileNotFoundException() : MyException("FileNotFoundException") {}
};
struct IOException : public MyException
{
IOException() : MyException("IOException") {}
};
struct DBException : public MyException
{
DBException() : MyException("DBException") {}
};
我所有的异常抛出都包含在这个宏中
#define EXCEPTION_THROWER(ET, message) \
{ \
ET e; \
e.setMessage(message); \
e.setLocation(__func__, __FILE__, __LINE__); \
throw e; \
}
并称为
EXCEPTION_THROWER(DBException, "Blah blah database exception")
中间 try/catch 块看起来像这样:
try
{
// Call a function that throws an exception
}
catch(const std::exception &e)
{
throw e; // Forward any exceptions
}
并且驱动程序代码全部在一个 try
块和一个 catch (const std::exception &e)
块中。
throw e;
正在执行 object slicing 的桶负载,因为它本质上是将 e
的内容切片到 std::exception
(并且 _msg
将丢失)。
使用throw;
重新抛出捕获的异常通过引用。