使用场景

  1. // string exception class, where the exception is described by a std::string
  2. class Exception : public std::exception
  3. {
  4. public:
  5. Exception(const std::string& err) noexcept : err_(err) {}
  6. Exception(std::string&& err) noexcept : err_(std::move(err)) {}
  7. virtual const char* what() const throw() { return err_.c_str(); }
  8. const std::string& err() const noexcept { return err_; }
  9. virtual ~Exception() throw() {}
  10. void add_label(const std::string& label)
  11. {
  12. err_ = label + ": " + err_;
  13. }
  14. void remove_label(const std::string& label)
  15. {
  16. const std::string head = label + ": ";
  17. if (string::starts_with(err_, head))
  18. err_ = err_.substr(head.length());
  19. }
  20. private:
  21. std::string err_;
  22. };

可以看到Exception类的成员有的用noexcept表示该成员函数不会抛出异常。
有的用的是throw()表示不会抛出异常。
throw(…) 表示会抛异常,指定参数的话,就表示只会抛某类异常,通常不建议使用。

参考

https://stackoverflow.com/questions/12833241/difference-between-c03-throw-specifier-c11-noexcept
https://stackoverflow.com/questions/88573/should-i-use-an-exception-specifier-in-c/88905#88905