被C++11抛弃的异常规范-exception specification

即使是被C++ 11抛弃的东西,但还是有必要了解一下。当然,抛弃了异常规范throw()之后,C++ 11引入了一种特殊的异常规范——noexcept

1.什么是异常规范?

C++语法,在函数名后面加上throw(something),表示对函数异常安全作出限制,有如下3种规范:

  • void fun () throw ( ):函数不会引发异常。 但是,如果从标记为 throw() 函数引发异常,编译器一般不会调用意外处理函数。因此,如果函数引发异常,则程序可能无法正确执行。
  • void fun() throw(…):函数可以抛出任何形式的异常。
  • void fun() throw(type):函数可以引发type类型的异常。

然而,针对函数不会引发异常throw(),C++11引入了另一个关键字noexcept指出函数不会引发异常:
void fun() noexcept;

但是,对于上述这种异常规范,也存在一些争议。

2.try、throw和catch语句

若要在 C++ 中实现异常处理,你可以使用 trythrowcatch 表达式。首先,使用 try 块将可能引发异常的一个或多个语句封闭起来。throw 表达式发出信号,异常条件(通常是错误)已在 try 块中发生。

你可以使用任何类型的对象作为 throw 表达式的操作数。 该对象一般用于传达有关错误的信息。 在大多数情况下,我们建议你使用 std:: exception 类或标准库中定义的派生类之一。 如果其中的类不合适,建议你从 std::exception 派生自己的异常类。

(1)try语句块示例

示例1

如果抛出异常,输出:

示例2

 

(2)异常规范和try语句块的使用(参考自MSDN异常规范示例):

输出结果:

 

参考:
MSDN
C++ Primer 5th
cppreference

发表评论

电子邮件地址不会被公开。 必填项已用*标注