C++ 什么是std::exception::what()以及为什么要使用它?

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

我来自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 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的副本,可能在您所附的链接中嘿,我有一个部分答案,但这仍然不能回答我的问题。