新闻资讯

NEWS CENTER
栏目导航

C++ 异常处理

发布时间:Mar 03, 2019         已有 人浏览

  异常是程序在执行期间产生的问题。C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作。

  异常提供了一种转移程序控制权的方式。C++ 异常处理涉及到三个关键字:try、catch、throw。

  如果有一个块抛出一个异常,捕获异常的方法会使用try和catch关键字。try 块中放置可能抛出异常的代码,try 块中的代码被称为保护代码。使用 try/catch 语句的语法如下所示:

  如果try块在不同的情境下会抛出不同的异常,这个时候可以尝试罗列多个catch语句,用于捕获不同类型的异常。

  您可以使用throw语句在代码块中的任何地方抛出异常。throw 语句的操作数可以是任意的表达式,表达式的结果的类型决定了抛出的异常的类型。

  catch块跟在try块后面,用于捕获异常。您可以指定想要捕捉的异常类型,这是由 catch 关键字后的括号内的异常声明决定的。

  上面的代码会捕获一个类型为ExceptionName的异常。如果您想让 catch 块能够处理 try 块抛出的任何类型的异常,则必须在异常声明的括号内使用省略号 ...,如下所示:

  下面是一个实例,抛出一个除以零的异常,并在 catch 块中捕获该异常。

  由于我们抛出了一个类型为const char*的异常,因此,当捕获该异常时,我们必须在 catch 块中使用 const char*。当上面的代码被编译和执行时,它会产生下列结果:

  C++ 提供了一系列标准的异常,定义在exception中,我们可以在程序中使用这些标准的异常。它们是以父子类层次结构组织起来的,如下所示:

  您可以通过继承和重载exception类来定义新的异常。下面的实例演示了如何使用 std::exception 类来实现自己的异常:

  在这里,what()是异常类提供的一个公共方法,它已被所有子异常类重载。这将返回异常产生的原因。

  const throw()不是函数,这个东西叫异常规格说明,表示what函数可以抛出异常的类型,类型说明放到()里,这里面没有类型,就是声明这个函数不抛出异常,通常函数不写后面的就表示函数可以抛出任何类型的异常。

  1、异常规格说明的目的是为了让函数使用者知道该函数可能抛出的异常有哪些。 可以在函数的声明中列出这个函数可能抛掷的所有异常类型。例如:

  在之前的例子里,我们使用了一个 throw 表达式以避免把两个代表不同书籍的 Sales_item 相加。我们假设执行 Sales_item 对象加法的代码是与用户交互的代码分离开的。其中与用户交互的代码负责处理发生的异常,它的形式可能如下所示:

  程序本来要执行的任务出现在 try 语句块中,是因为这段代码可能会抛出一个 runtime_error 类型的异常。

  try 语句块对应一个 catch 子句。该子句负责处理类行为 runtime_error 的异常。如果 try 语句块的代码抛出了runtime_error 异常,接下来执行 catch 块内的语句。在我们书写的 catch 子句中,数出一段提示信息要求用户指定程序是否继续。如果用户输入 n,执行 break 语句并退出 while 循环;否则,直接执行 while 循环的右侧花括号,意味着程序控制权条回到 while 条件部分准备下一次迭代。

  给用户的提示信息中输出了 err.what() 的返回值。我们知道 err 的类型是 runtime_error,因此能推断 what 是 runtime_error 类的一个成员函数。每个标准库异常类都定义了名为 what 的成员函数。这些函数没有参数,返回值是 C 风格字符串(即 const char *)其中,runtime_error 的 what 成员函数返回的是初始化一个具体对象所用的 string 对象的副本。如果上一节编写的代码抛出异常,则本节的 catch 子句输出:

  在 C++11 中,声明一个函数不可以抛出任何异常使用关键字 noexcept。

Copyright © 2002-2019 幸运蛋蛋开奖结果 版权所有