C++异常处理机制小细节

1.10:C++的异常处理机制!(课程共5200字,4段代码举例分析) 然而,我们可能忽略了一些细节和问题。例如,异常对象的析构顺序、异常对象的传递方式、异常对象的复制和移动等问题。程序员需要注意这些细节和问题,以确保程序的正确性、性能和稳定性。此外,程序员还应该根据具体情况选择合适的异常类和处理方式,并在调试和优化中注意以上细节和问题,以确保程序的正确性、性能和稳定性。 阅读详情

异常处理可以让我们把文件的检测和解决问题的过程分离开来。
在C++语言中,我们通过抛出一条表达式来引发一个异常。被抛出的表达式的类型以及当前的调用链共同决定了哪段处理代码将被用来处理该异常。被选中的处理代码是在调用链中与抛出对象类型匹配的最近的处理代码。
当执行一个throw时,跟在throw后面的语句不再执行。并且程序的控制权从throw转移到与之匹配的catch模块。意思就是:
1. 沿着调用链的函数可能会提早退出
2. 程序开始执行异常处理代码时,沿着调用链创建的对象将被销毁。

例子:

#include <iostream>
using namespace std;
#include <cstdio>
class Test
{
    public:
        Test(int a):_a(a){};
        ~Test()
        {
            printf("析构\n");
        }
        void test()
        {
            printf("%d\n", _a);
            throw 1;
            printf("%d\n", _a);
        }
    private:
        int _a;
};
int main()
{
    try
    {   
        Test t(3);
        t.test();
        printf("2");    
    }
    catch(int e)
    {
        cout<<"error"<<endl;
    }
    return 0;
}  

结果输出:

3  
析构  
error   

这就说明了在try语句中实例化了t并执行了t.test()输出了_a的值为3,t.test()中throw了一个错误1,那么此时test()函数立马结束了,回到try语句中,printf("2")语句也不会被执行并且创建对象t被提前销毁了,调用析构函数输出了析构,程序寻找与之匹配的catch,输出了error。
try寻找匹配的catch的过程称为栈展开:

当抛出一个异常后,程序暂停当前函数的执行过程并立即开始寻找
与之匹配的catch语句。当throw出现在一个try语句块中,检查与该try块关联的catch子句。如果找到了匹配的catch,就使用该catch处理异常,如果这一步没找到匹配的catch且该try语句嵌套在其他try块中,则继续检查与外层try匹配的catch子句。如果还是找不到匹配的catch,则退出当前的函数,在调用当前函数的外层函数中继续寻找。

栈展开过程沿着嵌套函数的调用链不断查找,直到找到了与异常匹配的catch子句为止:或者也可能一直没找到匹配的catch,则退出主函数后查找过程终止。
一个异常如果没有被捕获,则它将终止当前程序。

同时需要注意的是,如果在try语句中有申请的内存时,必须在throw之前把内存释放了,否则会造成内存泄漏。所以我们一般将内存的释放写在析构函数中防止内存的泄漏。
在catch语句的匹配中,如果参数类型是一个对象,并且throw语句抛出的是该对象的派生类的话,那么匹配到了之后,catch语句中只能使用基类的成员,如果抛出的是该对象的基类,那么不会匹配到该catch语句。
理论上异常会发生在程序执行的任何时刻,如果异常发生在构造函数初始化列表时,则需要进行另外的处理。因为初始化列表发生在执行构造函数之前,意思就是构造函数之前的try语句还未生效,异常发生了。解决方法的例子如下:

class Test
{
    public:
        Test(int num)
        try:tArray(new int[num])
        {
            cout << " Constructing " << num << endl;
        }
        catch(bad_alloc& err)
        {
            cout<<"failed"<<endl;
        }
        int *tArray;

};
SAP ABAP开发避坑:BAPI_MATVAL_PRICE_CHANGE调用报‘估价未维护’的完整解决流程 本文深入解析SAP ABAP开发中调用BAPI_MATVAL_PRICE_CHANGE函数时遇到的'估价未维护'错误,提供从基础配置检查到CKML_PRICE_SEND表维护的完整解决方案。通过实战案例和代码示例,帮助开发者快速定位问题并实现批量价格更新的自动化处理,提升开发效率。 阅读详情

相关推荐

lidar360 V8.0 & lidar360MLS V8.0雷达点云数据处理软件

机载林业 — 基于机载激光雷达点云数据提取一系列森林结构参数(如:高度分位数、叶面积指数、郁闭度等),分割单木并提取单木参数(包括树的位置、树高、胸径、枝下高、冠幅等属性),利用软件的多种回归分析功能可以结合地面调查数据反演森林生物量、蓄积量等功能参数。还可以生成等高线、山体阴影、坡度、坡向、粗糙度等多种产品。分类 — LiDAR360提供多种分类功能,包括地面点分类、模型关键点分类、选择区域地面点分类、机器学习模型分类(可高效地分离建筑、植被、路灯等通用类别)、深度学习模型分类、自定义深度学习分类等。

2403_83796253的博客 5149

C++异常处理在Linux中的陷阱与突破:99%开发者忽略的信号机制细节

深入解析C++ Linux开发中异常与信号的交互陷阱,揭示多线程、异步场景下崩溃根源及防护策略,结合实例讲解setjmp/longjmp与RAII协同方案,提升程序健壮性,值得收藏。

LogicNest的博客 459

从芯片原厂到BSP工程师:技术转型与核心能力解析

嵌入式系统开发中,BSP(板级支持包)作为连接硬件与操作系统的关键层,其开发能力直接影响设备稳定性与性能。理解Linux内核架构(如内存管理、进程调度)和基础接口协议(I2C/SPI/USB)是BSP工程师的核心技能。在芯片验证与驱动开发场景中,多核异构系统调试与稳定性问题排查(如死机分析)展现了工程师的实战能力。随着物联网与智能设备发展,掌握从硬件适配到系统优化的全链路技术栈,成为职业发展的关键突破点。

weixin_36012152的博客 599

C++ 异常处理机制的实现

介绍 相对于传统语言,C++ 的革命性特征之一,就是它对异常处理的支持。传统异常处理技术有缺陷并且易于出错,而 C++ 提供了一个非常优秀的替代方案。它将正常流程代码与错误处理代码清晰的隔离出来,使得程序更加健壮,易于维护。这篇文章将讨论编译器是如何实现异常处理的。假定读者已经对异常处理机制及其语法已经有了大致的了解。我用 VC++ 实现了本文中介绍的异常处理库。要将异常处理器替换成我的 VC+...

826

AVEVA PDMS 二次开发之PML实战:从宏到自定义窗体的效率提升

本文详细介绍了AVEVA PDMS二次开发中PML语言的应用,从基础宏编写到高级窗体开发,全面提升工程设计效率。通过实战案例展示如何利用PML实现批量操作、流程自动化和交互优化,帮助工程师快速掌握这一强大工具。

weixin_42549451的博客 338

Win11 24H2家庭版共享打印机失败?别慌,一个批处理脚本搞定所有设置

本文提供了Win11 24H2家庭版共享打印机失败的解决方案,通过一个批处理脚本自动修复所有设置问题。脚本包含安装组策略组件、修改关键注册表项等操作,帮助用户快速恢复打印机共享功能,适用于普通家庭用户。

weixin_30632089的博客 418

C++异常处理

潜心研究C++异常处理机制数日,有所得,与大家共享: C++异常处理机制核心观点: 0.如果使用普通的处理方式:ASSERT,return等已经    足够简洁明了,请不要使用异常处理机制. 1.比C的setjump,longjump优秀. 2.可以处理任意类型的异常.    你可以人为地抛出任何类型的对象作为异常.    throw 100;    throw "hello";    ... 3

晨枫 1706

MPC模型预测控制实战:从理论到代码实现(Python示例)

本文详细介绍了MPC模型预测控制的实战应用,从理论到Python代码实现。通过构建系统模型、预测方程、优化问题及约束处理,展示了如何实现一个完整的MPC控制器。文章还提供了水箱液位控制的应用案例,帮助读者掌握MPC在工业控制中的实际应用。

weixin_42653691的博客 459

C++的异常处理

一、什么是异常处理         一句话:异常处理就是处理程序中的错误。 二、为什么需要异常处理,以及异常处理的基本思想         C++之父Bjarne Stroustrup在《The C++ Programming Language》中讲到:一个库的作者可以检测出发生了运行时错误,但一般不知道怎样去处理它们(因为和用户具体的应用有关);另一方面,库的用户知道怎样处理这些错

乐观进取 奋斗不止 909

雨雾天YOLOv8检测拉胯?暗通道去雾+上下文注意力双优化,mAP从58%飙到79%,暴雨也能看清车牌

室外交通监控:高速、省道的雨雾天检测,重点解决小车、货车漏检;车载ADAS系统:雨天行车时的前方车辆、行人识别,需实时性(<40ms);隧道出入口:明暗交界+雾天的复杂场景,暗通道能平衡亮度。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1380

【2024/3/12 更新】Windows Server 2019 服务配置与管理汇总

本栏目一共介绍了17种Windows Server 2019 的服务配置与管理,为了方便大家阅读理解,特意总结了17种服务的一些内容。具体说明如下所示

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 2万+

C++语言学习(十八)——异常处理

C++语言学习(十八)——异常处理 文章来源:https://blog.51cto.com/9291927/2164586 一、C语言异常处理 异常是指程序在运行过程中产生可预料的执行分支。如除0操作,数组访问越界、要打开的文件不存在。 Bug是指程序中的错误,是不被预期的运行方式。如野指针、堆空间使用结束未释放。 C语言中处理异常的方式一般是使用if…else…分支语句。 double divide(double a, double b) { const double delta = 0.0000

m0_43426943的博客 529

【基于CKF的IMM】CV和CT两个模型下的IMM,二维,滤波使用CKF(容积卡尔曼滤波),附完整的matlab代码

该文章摘要: 本文提出了一种基于交互多模型(IMM)和容积卡尔曼滤波(CKF)的融合定位算法,用于解决目标在直线运动和转弯机动之间的模型切换问题。通过MATLAB仿真实现了IMM-CKF算法,并与单一的CV-CKF(匀速模型)和CT-CKF(匀角速转弯模型)方法进行对比。实验结果表明,在包含直线段和转弯段的复合轨迹跟踪中,IMM-CKF方法能够自适应调整模型权重,显著提高了定位精度。轨迹跟踪图、位置/速度误差对比图以及模型概率曲线直观展示了IMM算法的优势。文章提供了完整的MATLAB实现代码,可用于目标跟

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 615

C++ Exception机制

C++异常机制的执行顺序。 在构造函数内抛出异常 /* * ExceptClass.h * * Created on: 2018年1月2日 * Author: jacket */ #ifndef EXCEPTCLASS_H_ #define EXCEPTCLASS_H_ #include <iostream> u...

abbywu1225的博客 251

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

《C++ Primer》习题参考答案:第5章 - 循环、分支、跳转和异常处理语句

第五章 语句 练习5.1 什么是空语句?什么时候会用到空语句? 解: 只含义一个单独的分号的语句是空语句。如:;。 如果在程序的某个地方,语法上需要一条语句但是逻辑上不需要,此时应该使用空语句。 while (cin >> s && s != sought) ; 练习5.2 什么是块?什么时候会用到块? 解: 用花括号括起来的语句和声明的序列就是块。 { // ....

种树最好的时间是10年前,其次是现在!!! 3804

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C++ try catch() throw 异常处理

其它很多程序员一样,本书的主人公阿愚也是在初学C++时,在C++的sample代码中与异常处理的编程方法初次邂逅的,如下: // Normal program statements ... try { // Execute some code that might throw an exception. } catch( CException* e ) {

jiangxinyu的专栏 1676

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C/C++异常处理

异常概念 程序在运行过程中可能产生异常,异常是程序运行时可预料的执行分支,Bug是程序错误,是不可被预期的运行方式 C语言处理异常的方式 void func(...) { if(判断是否产生异常) { 正常情况代码逻辑; } else { 异常情况代码逻辑; } } 例子: #include <iostream> #include <s...

qq_41936794的博客 456

使用lambdaquery() 报空指针异常_C++ 异常机制分析

作者:melonstreet链接:https://www.cnblogs.com/QG-whz/p/5136883.html阅读目录C++异常机制概述throw 关键字异常对象catch 关键字栈展开、RAII异常机制与构造函数异常机制与析构函数noexcept修饰符与noexcept操作符异常处理的性能分析C++异常机制概述异常处理是C++的一项语言机制,用于在程序中处理异常事件。异...

weixin_39942995的博客 233

Visual C++中的异常处理浅析

Visual C++提供了对C语言、C++语言及MFC的支持,因而其涉及到的异常(exception)处理也包含了这三种类型,即C语言、C++语言和MFC的异常处理。除此之外,微软对C和C++的异常处理进行了扩展,提出了结构化异常处理(SEH)的概念,它支持C和C++(与之相比,

350

C++ Insights栈展开机制:异常处理时的资源清理

你是否曾经好奇C++编译器在异常发生时如何确保所有局部对象都能被正确清理?C++ Insights项目通过源码到源码的转换,为我们揭示了编译器在异常处理时的栈展开(Stack Unwinding)机制,让复杂的资源清理过程变得清晰可见。 ## 栈展开的核心原理 栈展开是C++异常处理的关键机制,确保在异常抛出时,所有已构造的局部对象都能按构造的逆序调用析构函数。C++ Insights通过[L

gitblog_00087的博客 743

C++异常处理机制的底层实现:深入理解`_Unwind_Resume`与DWARF/SEH规范

我们深入探讨了C++异常处理机制的底层实现,重点分析了。

weixin_41455464的博客 650

C++异常处理之底层逻辑

C++ 异常处理之底层逻辑

zhangxiang0503的博客 563

C++编译器如何实现异常处理

http://www.51cto.com/art/200511/11258.htmhttp://localvar.blogchina.com/blog/1068938.htmlVishal Kochhar         C++编译器如何实现异常处理- -                                       从实现的角度讲解VC++中的异常处理机制

xu的blog 2200
上一篇: Linux系统编程-文件IO(一)
下一篇: 数据结构与算法学习-堆排序
UKey_
博客等级 码龄10年 258粉丝 186原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值