c++ - 在 C++ 中编写自定义异常

标签 c++ custom-exceptions

<分区>

我有 Ruby 和 Java 背景,最近开始探索 C++。

虽然我最初尝试通过简单地对异常类进行子类化来创建自定义异常,但由于晦涩难懂而失败,我发现网站上发布了以下示例:

class Exception : public exception
{
public:
  Exception(string m="exception!") : msg(m) {}
  ~Exception() throw() {}
  const char* what() const throw() { return msg.c_str(); }

private:
  string msg;
};

目前我对 C++ 语义的理解还不是很成熟,我想对这里发生的事情有一个更好的理解。

在语句const char* what() const throw()中,const throw()部分做了什么,它是什么编程结构?

此外,析构函数规范 ~Exception()throw() 的目的和意图是什么,为什么我需要有一个析构函数规范,尽管我没有不需要它做一些特别的事情吗?从异常继承的析构函数不应该足够了吗?

最佳答案

const 在方法声明该方法不改变对象之后。 (也有异常(exception),通常它用来表示“不以外部可见的方式改变对象”。)

方法声明后的throw()是异常规范;它类似于您在 Java 中看到的 throws E1, E2 异常规范。但是,在 C++ 中,异常规范不会在编译时检查,并且通常被认为几乎没有用(它们现在已被弃用)。 throw() 是唯一有点用的形式,这意味着该函数声明它不得抛出异常(如果抛出,则为逻辑错误,程序将调用意外异常处理程序,默认终止程序)。

析构函数是显式声明的,因为如果未指定,编译器将生成一个调用基类析构函数的析构函数,并且编译器生成的析构函数不会使用 throw() 异常规范(尽管事实上,在析构函数中抛出异常从来都不是一个好主意)。

关于c++ - 在 C++ 中编写自定义异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13258786/

相关文章:

c++ - 以 root ubuntu 身份自动运行我的可执行文件

c++ - C++ 中的模板和预处理

c++ - 放弃 auto_ptr 包含对象的所有权

c++ - 程序在 fclose() 上崩溃

python - python-ldap 的异常是否按层次结构组织?

java - if for 循环抛出自定义异常

c++ - 为什么此模板代码中需要 static 关键字?

java - 自定义异常 : Differentiate via many subclasses or single class backed with enum?

c# - 如何使用将帮助链接默认为 google.com 的构造函数创建子类?

java - 将字符串识别为输入,如果不是整数则抛出异常