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 其他
在这个类中,看见了两个不常见的关键字noexecpt和override
noexecpt
以下内容摘抄自:
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 可以用来阻止异常的传播和扩散,请看下面的例子:
然后我们分析运行结果可以得到这样的结论:NoBlockThrow会让Throw 函数抛出的异常继续抛出,直到 mian 中的catch 语句将其捕捉。而 BlockThrow 则会直接调用 std::terminate 中断程序的执行从而阻止了异常的继续传播。
override
参考:

浙公网安备 33010602011771号