给出一个类Stack
(例如):
class Stack {
// ...
class Exception : public std::exception {};
class Full : public Exception {};
class Empty : public Exception {};
};
让我们看看下一个函数f
(例如):
void f() {
try {
Stack s(100); // Only for the example.
} catch (Stack::Full& e) {
cerr << "Not enough room";
} catch (Stack::Exception& e) {
cerr << "Error with stack";
} catch (std::exception& e) {
cerr << e.what() << endl;
}
}
如果它转到最后catch
将是什么输出?
我需要在what()
类中声明Exception
函数的工作原理吗?
答案 0 :(得分:1)
what()
的虚拟std::exception
方法是为您的例外提供有意义的消息的好方法,也是始终根据std::exception
创建自己的例外的好理由。
这种方法非常好用的是它是STL的标准化部分。 STL异常在what()
中返回有意义的消息。
这也意味着,如果您在Stack
内的某个地方使用套接字代码,您可以使用catch (std::exception& e)
来捕获它,例如在不知道有关异常的更深入细节的情况下打印出错误消息。
与此相反,非标准化方法显然只有在您明确捕获特定已知类型的异常时才可用。
就您的示例而言,这意味着您可以像这样创建例外:
class Stack {
// ...
class Exception : public std::exception {
virtual const char* what() override { return "Unspecified stack error"; }
};
class Full : public Exception {
virtual const char* what() override { return "Stack is full"; }
};
class Empty : public Exception {
virtual const char* what() override { return "Stack is empty"; }
};
};
然后你在try / catch中只需要捕获std::exception
:
void f() {
try {
Stack s(100); // Only for the example.
} catch (std::exception& e) {
cerr << e.what() << endl;
}
}
由于您的例外情况基于std::exception
,并且您覆盖了virtual const char* what()
,因此您将在catch子句中获取您的消息。