我已经看到至少一个可靠的源(我采用的C++类)建议C++中特定于应用程序的异常类应该继承std::exception.我不清楚这种方法的好处.
在C#中,继承的原因ApplicationException很明确:你得到了一些有用的方法,属性和构造函数,只需要添加或覆盖你需要的东西.有了std::exception这一切似乎你得到的是一个what()覆盖方法,你也可以同样创造自己.
那么,如果有的话,std::exception作为特定于应用程序的异常类的基类有什么好处呢?有没有好的理由不继承std::exception?
请查看以下异常抛出和捕获:
void some_function() {
throw std::exception("some error message");
}
int main(int argc, char **argv) {
try {
some_function();
} catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
exit(1);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
通过引用捕获抛出的异常是否安全?
我担心的是因为异常e实际上是放在堆栈上的some_function().但some_function()刚刚回来,导致e被破坏.所以实际上现在e指向一个被破坏的对象.
我的担忧是否正确?
传递异常而不按值复制它的正确方法是什么?我应该抛出new std::exception()它放在动态内存中吗?
我正在学习C++,当我尝试创建自己的异常并将它们放在Linux上时,我遇到了这种情况.
我已经创建了一个小测试项目来测试我的实现,下面是我的异常类头文件.
class TestClass : public std::runtime_error
{
public:
TestClass(char const* const message) throw();
virtual char const* what() const throw();
};
Run Code Online (Sandbox Code Playgroud)
异常类的源文件是
using namespace std;
TestClass::TestClass(char const* const message) throw()
: std::runtime_error(message)
{
}
char const * TestClass::what() const throw()
{
return exception::what();
}
Run Code Online (Sandbox Code Playgroud)
在我的主应用程序中,我正在调用一个抛出异常并在try/catch中捕获它的函数,如下所示:
void runAFunctionAndthrow();
/*
*
*/
int main(int argc, char** argv) {
try
{
cout << "About to call function" << endl;
runAFunctionAndthrow();
}
catch (TestClass ex)
{
cout << "Exception Caught: " << ex.what() << …Run Code Online (Sandbox Code Playgroud)