-
异常(exception)比错误码(error code)好在哪里?
(1)error code 可能含义是比较模糊的,你必须深入到被调用代码中才能明白其含义。当然,一个宏定义可能会稍稍的解决这个问题。
(2)error code 一般都是作为返回值return的,这就限制了函数的定义,要想获取其他的函数返回值,只能使用传出参数来解决。
(3)需要在代码里不断的校验返回值是否正确,这样使得代码的结构很差,看起来不够清晰明了。
note: error code 也有有点,就是比较简单。
-
C++的异常处理包括三部分
-
throw
表达式,用于在遇到错误的时候将异常抛出。 - 一个或多个
catch
子句,用于处理抛出的不同类型的异常。 -
try
block。我们通常将可能会出现异常的语句放到该block中,也就是说这个block中或者或有throw
表达式,或者会调用可能抛出异常的函数。
下边是一个简单的异常处理的例子
try
{
//do something
.....
throw ExampleException;
}
catch(ExampleException exception)
{
//do somethinfg to handle ExampleException
}
-
当exception发生时,编译系统应该完成以下事情
- 检验发生
throw
操作的函数 - 决定
throw
操作是否发生在try
区段中。 - 若是,编译系统必须把exception type拿来和每一个catch子句进行比较。
- 如果比较后吻合,流程控制应该交到catch子句手中。
- 如果throw的发生并不在try区段内,或没有一个catch子句吻合,那么系统必须
(a) 摧毁所有active local objects
(b) 从堆栈中将目前的函数"unwind"掉
(c) 进行到程序堆栈的下一个函数中去,重复上述步骤2~5。
-
exception
相关的关键字
-
throw
用法:
throw expression
throw
-
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
类型

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