我需要如何使用虚函数 "what()"?
How I need to work with the virtual function "what()"?
给定一个classStack
(例如):
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
输出会是什么?
我需要在 Exception
class 中声明关于 what()
函数的工作吗?
std::exception
的虚拟 what()
方法是一种向您的异常提供有意义的消息的好方法,也是始终基于 std::exception
创建自己的异常的一个很好的理由。 =21=]
这种方法的好处在于它是 STL 的标准化部分。 what()
中的 STL 异常 return 条有意义的消息。
这也意味着,如果您要在 Stack
中的某处使用套接字代码,您会用 catch (std::exception& e)
捕获它,例如在不知道有关异常的更深入细节的情况下打印出错误消息。
与此相反,non-standardized 方法显然只有在您明确捕获特定已知类型的异常时才可用。
就您的示例而言,这意味着您可以像这样创建异常:
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 子句中获得消息。
给定一个classStack
(例如):
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
输出会是什么?
我需要在 Exception
class 中声明关于 what()
函数的工作吗?
std::exception
的虚拟 what()
方法是一种向您的异常提供有意义的消息的好方法,也是始终基于 std::exception
创建自己的异常的一个很好的理由。 =21=]
这种方法的好处在于它是 STL 的标准化部分。 what()
中的 STL 异常 return 条有意义的消息。
这也意味着,如果您要在 Stack
中的某处使用套接字代码,您会用 catch (std::exception& e)
捕获它,例如在不知道有关异常的更深入细节的情况下打印出错误消息。
与此相反,non-standardized 方法显然只有在您明确捕获特定已知类型的异常时才可用。
就您的示例而言,这意味着您可以像这样创建异常:
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 子句中获得消息。