C++异常处理(try语句的使用,异常的传播,栈展开)

try块可以嵌套使用,当try内部模块中为捕获到异常时,传播到外部捕获。当内层已经捕获异常时,将不再传播到外层。当需要传播到外层时,需要内部捕获该异常后,重新再抛出异常,就可以传播到外面。注意重新抛出异常的时候会调用拷贝构造函数。

当异常均未被捕获时,将调用terminate函数,terminate函数默认调用系统的abort()函数终止进程。可以用set_terminate函数设置terminate调用的函数。

栈展开的定义是,沿着嵌套调用链接向上查找,直至为异常找到一个catch子句。这个过程称之为栈展开。在栈展开的过程中,会为生产的局部对象调用析构函数。

构造函数中可以抛出异常,抛出异常时应消除已构造的对象(如已构造一个obj = new Obj,就要保证delete掉这个new出来的对象)。由于构造未完成,所以不会调用析构函数。

注意:抛出异常的时候,就会调用析构函数,而不是捕获异常的时候,在main中抛出异常后,在这个异常未被捕获之前,在调用析构函数又抛出异常,此时就会调用terminate函数。这样抛出异常就没有意义了,所以一般来说不应在析构函数中抛出异常。

时间: 2024-08-03 19:22:55

C++异常处理(try语句的使用,异常的传播,栈展开)的相关文章

JVM【第六回】:【OutOfMemoryError异常之虚拟机栈和本地方法栈溢出】

由于在HotSpot虚拟机中并不区分虚拟机栈和本地方法栈,因此对于HotSpot来说,-Xoss参数(设置本地方法栈大小)虽然存在,但实际上是无效的,栈容量只由-Xss参数设定.关于虚拟机栈和本地方法栈,在Java规范中描述了两种异常: 如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常. 如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常. 在下面的代码中,如果将范围限制于单线程中的操作,尝试下面两种方法均无法让

事件和异常的传播 · 农场主的黑科技.

inBound事件的传播 何为inBound事件以及ChannelInboundHandler ChannelRead事件的传播ChannelRead是典型的inbound事件,以他为例了解inbound事件的传播 SimpleInBoundHandler处理器 何为inBound事件以及ChannelInboundHandler ChannelHandler的继承关系 ChannelInboundHandlerAdapter,ChannelOutboundHandlerAdapter.用户代码

python中的异常处理相关语句和迭代器

异常(基础) exception什么是错误    错误是指由于逻辑或语法等导致一个程序无法正常执行的问题什么是异常    异常是程序出错时标识的一种状态    当异常发生时,程序不会再向下执行,而转去调用此函数的地方待处理此错误并恢复为正常状态  作用:    用作信号,通知上层调用者有错误产生需要处理try语句:    两种语法:    try- except    try --finally 语句try-except语句    语法:    try:        可能触发异常的语句   

重构第18天 用条件语句来代替异常(Replace exception with conditional)

理解:本文中的“使用条件判断代替异常”是指把没有必要使用异常做判断的条件尽量改为条件判断. 详解: 重构前代码: 1 public class Microwave 2 { 3 private IMicrowaveMotor Motor { get; set; } 4 5 public bool Start(object food) 6 { 7 bool foodCooked = false; 8 try 9 { 10 Motor.Cook(food); 11 foodCooked = true;

C++学习之路: try&catch 语句块处理异常

#include <iostream> #include <string> #include <vector> #include <stdexcept> using namespace std; //对于不同的异常可以采取不同的catch块进行捕捉 int main(int argc, const char *argv[]) { try { int i; cin >> i; if(i == 0) throw runtime_error("

shell 语句出错或者异常自动退出 不继续执行

         今天操作的时候遇到一个问题,需要把内容重定向到文件,然后再把文件重命名使用,结果重定向的时候已经抛异常了,下面的自然也会接着出现各种问题.所以,还是觉得一些关键操作要做一些判断或者捕获异常,避免出现更严重的问题. 解决办法如下: 使用set -e 你写的每一个脚本的开始都应该包含set -e.这告诉bash一但有任何一个语句返回非真的值,则退出bash. 使用-e的好处是避免错误滚雪球般的变成严重错误,能尽早的捕获错误.更加可读的版本:set -o errexit 使用-e把你

如何跟踪异常的传播路径?

package we; public class PrintExceptionStack { public static void main( String args[] ) { try { method1(); } catch ( Exception e ) { System.err.println( e.getMessage() + "\n" ); e.printStackTrace(); } } public static void method1() throws Except

C++异常相关

使用异常处理,程序中独立开发的各部分能够就程序执行期间出现的问题相互通信,并处理这些问题.C++ 的异常处理中,需要由问题检测部分抛出一个对象给处理代码,通过这个对象的类型和内容,两个部分能够就出现了什么错误进行通信. 一:概述 1:在C++中的异常处理语句包括: try:try语句块以try关键字开始,并且以一个或者多个catch子句结束.try语句块中执行正常的代码,并且可以抛出异常,在try块后面catch子句捕获异常,并处理之. throw表达式:用来抛出异常. try块的通用语法形式是

C++Primer_笔记_异常处理

异常,当一个函数发现一个无法处理的错误时抛出异常,让函数的 调用者直接或间接的处理这个问题. 异常处理,是一种允许两个独立开发的程序组件在程序执行期间遇到程序不正常的 情况(称为异常,exception )时相互通信的机制. 异常抛出: throw (表达式) 异常发现与抛出异常: /*发现异常并且抛出异常*/ try {     //可能出现异常的语句 } 捕获异常: catch(类型名 + 形参名)    //捕获特定类型异常 {      } catch(...)           //