6-mudo-base-Exception

 

1 类说明

muduo的异常类

 

2 继承

  • std::exception

    • std::exception只有一个what函数用来返回c类型字符串的异常信息

 

2 成员变量说明

  • message_

    • 异常信息字符串

  • stack_

    • 函数调用栈信息的字符串

 

3 成员函数说明

1 non-static

  • 构造函数:

    • 传入字符串what来初始化message_

    • 调用CurrentThread::stackTrace(/demangle=/false)来初始化stack_,关于CurrentThread::stackTrace:将函数调用栈信息保存起来。用到了两个函数:

      • backtrace,栈回溯,保存各个栈帧的地址

      • backtrace_symbols,根据地址,转成相应的函数符号(函数名称),当然这个函数名称是经过name mangling的。

      • abi::__cxa_demangle:可以将name mangling的名称符号转换为原来的。

  • 析构函数

    • 用默认生成的=default

  • what

    • 重写父类的what函数,返回messag_.c_str()

  • stackTrace

    • 返回stack_.c_str()

 

4 其他

在这个类中,看见了两个不常见的关键字noexecptoverride

 

noexecpt

以下内容摘抄自:noexcept 关键字 - 知乎 (zhihu.com)

noexcept 是C++11 为了替代 throw() 而提出的一个新的关键字,在 C++ 中使用函数异常声明列表来查看函数可能抛出的异常。比如:

 void func() throw (int,double);

上例就是一个函数异常声明列表,该声明指出 func 可能抛出int和 double 类型的异常。但是在实际编程中很少使用这种写法,所以这一特性在 C++11 中被抛弃。另外,如果异常声明列表写成如下形式:

 void func() throw();

这种写法表示函数 func 不抛出任何异常,而这种写法在 c++11 中被新的关键字 noexcept 异常声明所取代。

语法上 noexcept 修饰符有两种形式,一种就是简单地在函数声明后加上 noexcept 关键字。比如:

 void func() noexcept;

另外一种形式则是接受一个常量表达式(参阅《常量表达式》)作为参数,如下所示:

 void func() noexcept(常量表达式);

常量表达式的结果会被转换成一个 bool 类型的值,该值为 true,表示函数不会抛出异常,反之则可能抛出异常。而不带常量表达式的 noexcept 相当于声明了 noexcept(true),即不会抛出异常。

noexcept 的使用

noexcept 可以用来阻止异常的传播和扩散,请看下面的例子:

 #include <iostream>
 #include <exception>
 
 using namespace std;
 
 void Throw() {
     throw 1;
 }
 
 void NoBlockThrow() {
     Throw();
 }
 
 void BlockThrow() noexcept{
     Throw();
 }
 
 int main(){
 
     try {
         Throw();
    }
 
     catch(...) {
         cout << "Found throw." << endl; // Found throw
    }
 
     try {
         NoBlockThrow();
    }
 
     catch(...) {
         cout << "Throw is not blocked" <<endl;
    }
 
     try {
         BlockThrow();
    }
 
     catch(...) {
         cout << "Found throw 1" << endl;
    }
 }
 
 /**
  * 输出
  * Found throw.
  * Throw is not blocked
  * terminate called after throwing an instance of 'int'
 */

然后我们分析运行结果可以得到这样的结论:NoBlockThrow会让Throw 函数抛出的异常继续抛出,直到 mian 中的catch 语句将其捕捉。而 BlockThrow 则会直接调用 std::terminate 中断程序的执行从而阻止了异常的继续传播。

 

override

作用:在成员函数声明或定义中, override 确保该函数为虚函数并覆写来自基类的虚函数。

参考:C++ 11 :override 关键字的使用 - schips - 博客园 (cnblogs.com)

 
posted @ 2023-05-04 10:03  DavidJIAN  阅读(16)  评论(0)    收藏  举报