C++ 什么是std::exception::what()以及为什么要使用它?
我来自c++98,我正在努力进入c++11等等。我遇到了公共成员函数,C++ 什么是std::exception::what()以及为什么要使用它?,c++,c++11,exception,noexcept,C++,C++11,Exception,Noexcept,我来自c++98,我正在努力进入c++11等等。我遇到了公共成员函数,std::exception::what,virtual const char*what()const noexcept 从这个例子中的C++引用:我可以理解用法,但我有几个问题: // exception::what #include <iostream> // std::cout #include <exception> // std::exception struct oo
std::exception::what
,virtual const char*what()const noexcept代码>
从这个例子中的C++引用:我可以理解用法,但我有几个问题:
// exception::what
#include <iostream> // std::cout
#include <exception> // std::exception
struct ooops : std::exception {
const char* what() const noexcept {return "Ooops!\n";}
};
int main () {
try {
throw ooops();
} catch (std::exception& ex) {
std::cout << ex.what();
}
return 0;
}
//异常::什么
#include//std::cout
#include//std::exception
结构ooops:std::异常{
const char*what()const noexcept{return“Ooops!\n”;}
};
int main(){
试一试{
抛出ooops();
}捕获(标准::异常和例外){
std::cout关于第一个问题,请查看StoryTeller的评论。至于第二点:
why should i use what() it at all? i can emplement my
own tostring method in my class exception and call it instead!
编程的第一条规则是不要重新发明轮子,如果STL库中有一个toString函数或另一个函数满足您的需要,请使用它。不要发明自己的函数并尝试调试它
最后的noexcept
是什么
它是C++11中引入的新说明符。简而言之,它意味着函数不会引发异常。noexcept
与throw()
具有相同的含义
它带来了什么新东西吗
noexcept
是对旧的throw
说明符的改进,该说明符后来被弃用(C++11),然后被删除(C++20)从语言。它接受一个布尔表达式,该表达式确定函数是否为noexcept或可能引发。这在通用模板编程中很有用,因为模板的某些实例可能会引发,而其他实例可能不会
我为什么要使用what()呢?我可以在我的类异常中使用我自己的tostring方法并调用它
因为您可能使用的函数不是由您编写的,因此不会抛出异常类。例如,某些标准函数在某些情况下会抛出异常,而所有标准异常都源自std::exception
。在这种情况下,访问错误消息的唯一方法是通过what
>成员函数
当其他人调用您的函数时,也同样适用。他们可能不想/或不需要知道您的特殊异常类,但如果您继承std::exception
,他们仍然可以捕获它并打印消息
调用异常对象的非常量成员函数之前或的含义是什么
含义是字面意义。如果对从std::exception
派生的异常对象调用what
,并存储返回的指针,然后调用该异常对象的非常量成员函数,则存储的指针将无效
任何通过无效指针进行间接操作的尝试,如试图打印异常消息,都将导致未定义的行为。请不要在一个问题中问多个问题。尤其是当每个问题都可以由自己的SO帖子涵盖时。第一个问题是@StoryTeller UnslanderMonica的副本,可能在您所附的链接中嘿,我有一个部分答案,但这仍然不能回答我的问题。