美文网首页
C++ exception,throw 和 noexcept

C++ exception,throw 和 noexcept

作者: fck_13 | 来源:发表于2019-11-16 21:59 被阅读0次
  • 异常(exception)比错误码(error code)好在哪里?

(1)error code 可能含义是比较模糊的,你必须深入到被调用代码中才能明白其含义。当然,一个宏定义可能会稍稍的解决这个问题。
(2)error code 一般都是作为返回值return的,这就限制了函数的定义,要想获取其他的函数返回值,只能使用传出参数来解决。
(3)需要在代码里不断的校验返回值是否正确,这样使得代码的结构很差,看起来不够清晰明了。
note: error code 也有有点,就是比较简单。

  • C++的异常处理包括三部分

  1. throw 表达式,用于在遇到错误的时候将异常抛出。
  2. 一个或多个catch子句,用于处理抛出的不同类型的异常。
  3. try block。我们通常将可能会出现异常的语句放到该block中,也就是说这个block中或者或有throw表达式,或者会调用可能抛出异常的函数。

下边是一个简单的异常处理的例子

try
{
  //do something
  .....
  throw ExampleException;
}
catch(ExampleException exception)
{
  //do somethinfg to handle ExampleException
}
  • 当exception发生时,编译系统应该完成以下事情

  1. 检验发生throw操作的函数
  2. 决定throw操作是否发生在try区段中。
  3. 若是,编译系统必须把exception type拿来和每一个catch子句进行比较。
  4. 如果比较后吻合,流程控制应该交到catch子句手中。
  5. 如果throw的发生并不在try区段内,或没有一个catch子句吻合,那么系统必须
    (a) 摧毁所有active local objects
    (b) 从堆栈中将目前的函数"unwind"掉
    (c) 进行到程序堆栈的下一个函数中去,重复上述步骤2~5。
  • exception相关的关键字

  1. throw
    用法:
    throw expression
    throw

  2. noexcept

  • noexcept操作符
    noexcept有两种用法,一种是作为操作符使用。
    语法为 noexcept(expression)。它的返回值是一个纯右值的bool值。noexcept并不去求expression的值,而是探寻表达式是否会直接获取间接的去调用会抛出异常的代码。从这里可以看出,noexcept 操作符是在编译期发生作用的。

  • noexcept指示符
    noexcept的另一个用法就是作为指示符来使用。用来标明一个函数是否会抛出异常。通常的形式为
    returen_type func(argument_list arg) noexcept(expression)
    当expression为空的时候,括号也可以省略,等价于returen_type func(argument_list arg) noexcept(true),即不抛异常。

note: noexcept 也是函数声明的一部分,在函数重载的时候需要考虑。

  • 内置exception类型

exception.png

【参考】:
[1] cppreference - exception
[2] 深度探索C++对象模型

相关文章

网友评论

      本文标题:C++ exception,throw 和 noexcept

      本文链接:https://www.haomeiwen.com/subject/ywzxictx.html