例外
异常提供了一种通过将控制转到称为特殊函数来在程序特殊情况下(如运行时错误)反应
处理
。
捕获异常,部分代码被置于异常检查。这是通过封闭的代码部分以完成
试块。当一个特殊情况是块内出现,抛出一个异常,控制到异常处理程序转移。如果没有抛出异常,代码继续正常进行,所有的处理程序被忽略。
一个例外是通过使用引发
throw关键字从内部
try块。异常处理程序声明为关键字
catch,必须立即后放置
try块:
| | 出现异常。异常十五分。20 | 编辑及运行 |
下异常处理代码被封闭在一个
try块中。在这个例子中的代码简单地抛出一个异常:
| |
一个
throw表达式接受一个参数(在这种情况下,整数值
20),这是作为参数传递给异常处理程序通过。
异常处理程序声明与
catch该的右括号后,立即关键字
try块。的语法
catch是类似于具有一个参数的常规功能。参数的类型是非常重要的,因为由传递的参数的类型
throw表达反对检查,只有在它们匹配的情况下,异常是由处理程序捕获。
多个处理程序(即
catch表达式)可以链接; 每一个具有不同的参数类型。只有其参数类型中指定的异常的类型相匹配的处理程序
throw被执行的语句。
如果一个省略号(
...)被用作参数
catch,该处理程序将捕获所有异常无论什么异常的类型抛出。这可以被用作捕获不受其他处理程序捕获所有异常的默认处理程序:
| |
在这种情况下,最后的处理程序将捕获抛出一个类型既不是的任何异常
int,也没有
char。
经过一个异常被处理程序,执行后恢复 的try-catch块,而不是后
throw声明!
另外,也可以嵌套
try-catch多个外部内的块
try的块。在这些情况下,我们有一个内部的可能性
catch块转发例外它的外部的水平。这是用做表情
throw;不带参数。例如:
| |
异常规范
旧的代码可能包含 动态的异常规格。他们现在不赞成使用C ++,但仍然支持。一个 动态的异常规格如下函数的声明,附加一个throw说明它。例如:
| |
声明一个调用的函数
myfunction,这需要类型的一个参数
char和返回类型的值
double。如果这个函数抛出某种类型的比其他的异常
int,函数调用
的std ::意外 而不是寻找一个处理程序或调用
的std ::终止。
如果此
throw指示符留空没有类型,这意味着
的std ::意外被称为是任何异常。没有功能
throw符(普通函数)永远不会调用
的std ::意外,但遵循的寻找自己的异常处理程序正常轨道。
| |
标准异常
C ++标准库提供专为申报对象的基类来抛出例外。这就是所谓的std::exception,并在被定义
标头。这个类有一个叫做虚成员函数
what返回一个空值终止的字符序列(类型的
char *),并可以在派生类中重写包含某种异常的描述。
| | 我的例外发生。 | 编辑及运行 |
我们已向通过引用捕获异常对象(注意,符号的处理程序
&的类型之后),因此这也可以捕获来自派生类
exception,像我们
myex类型的对象
myexception。
所有异常由来源于此的C ++标准库抛出异常的组件抛出
exception类。这些是:
| 例外 | 描述 |
|---|---|
bad_alloc | 通过抛出new的分配失败 |
bad_cast | 通过抛出dynamic_cast时,它在动态转换失败 |
bad_exception | 通过一定的动态异常抛出符 |
bad_typeid | 通过抛出 typeid |
bad_function_call | 由空抛出function对象 |
bad_weak_ptr | 通过抛出shared_ptr当传递坏weak_ptr |
另外从推导
exception,头
定义了可以通过自定义异常报告错误继承两个通用的异常类型:
| 例外 | 描述 |
|---|---|
logic_error | 错误相关的程序的内部逻辑 |
runtime_error | 错误在运行时检测 |
其中,标准异常需检查一个典型的例子是在内存分配:
| | | 编辑及运行 |
可以由异常处理器在本实施例被捕获的例外是一个
bad_alloc。由于
bad_alloc是从标准基类派生
exception,它可以被捕获(通过引用捕获,捕获所有相关类)。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
