C++异常处理

宝塔面板+pbootCMS建站全流程:从服务器选购到上线优化(附常见问题排查) 本文提供了一份详尽的宝塔面板与pbootCMS建站实战指南。内容涵盖从云服务器选购、宝塔面板部署与安全加固,到pbootCMS安装、权限配置、数据库连接等核心步骤。同时深入讲解了PHP环境优化、Nginx伪静态设置、缓存开启等性能与SEO优化技巧,并附有常见问题排查与后期维护建议,帮助用户高效、稳健地完成专业网站构建。 阅读详情

异常:程序执行期间,可检测到的不正常情况。

例如:0作除数;数组下标越界;打开不存在的文件;远程机器连接超时;malloc失败等等。

程序的两种状态:

正常状态和异常状态,发生不正常情况后,进入异常状态,从当前函数开始,按调用链的相反次序,查找处理该异

常的程序片断。

1.throw 表达式

语义:用表达式的值生成一个对象(异常对象),程序进入异常状态。

Terminate函数,终止程序的执行。

2.try-catch语句

try{

包含可能抛出异常的语句;

}catch(类型名 [形参名]){

}catch(类型名 [形参名]){

}

例子程序:

#include <iostream>
#include <math.h>
using namespace std;
double sqrt_delta(double d){
if(d < 0)
throw 1;
return sqrt(d);
}
double delta(double a, double b, double c){
double d = b * b - 4 * a * c;
return sqrt_delta(d);
}
void main()
{
double a, b, c;
cout << "please input a, b, c" << endl;
cin >> a >> b >> c;
while(true){
try{
double d = delta(a, b, c);
cout << "x1: " << (d - b) / (2 * a);
cout << endl;
cout << "x2: " << -(b + d) / (2 * a);
cout << endl;
break;
}catch(int){
cout << "delta < 0, please reenter a, b, c.";
cin >> a >> b >> c;
}
}
}


3.重新抛出异常

语法: throw;

语义:重新抛出原有的异常对象。如果在throw后面有表达式,则抛出新的异常对象。

例子程序:

#include <iostream>
using namespace std;
void fun(int x){
try{
if(x == 1)
throw 1;
if(x == 2)
throw 1.0;
if(x == 3)
throw ''1'';
}catch(int){
cout << "catch an int in fun()" << endl;
}catch(double){
cout << "catch an double in fun()" << endl;
}
cout << "testing exception in fun()..."<< endl;
}
void gun()
{
try{
//fun(1);
//fun(2);
//fun(3);
fun(4);
}catch(char){
cout << "catch a char in gun()" << endl;
}
cout << "testing exception in gun()..."<< endl;
}
int main()
{
gun();
}


4.扑获所有异常

catch(...){
}


下面的程序是不对的:

error C2311: ''int'' : is caught by ''...'' on line 7

#include <iostream>
using namespace std;
void fun()
{
try{
}catch(...){
cout << "catch all exception ..." << endl;
}catch(int){
cout << "catch int exception ..." << endl;
}
}


5.异常规范

指出函数可以抛出的所有异常类型名。

语法:值类型函数名(形参表) throw(类型名表) 函数体

空异常规范表示不抛出异常;

例如:

warning C4297: ''function'' : function assumed not to throw an exception but does
__declspec(nothrow) or throw() was specified on the function

#include <io
stream>
using namespace std;
void function(int x) throw() 
{
if(x == 1) 
throw 1;
}


无异常规范表示可抛出任何异常。

异常规范违例,在函数的声明中并没有声明抛出该类异常,但在程序中却抛出了该类的异常?例如:

warning C4290: C++ exception specification ignored except to indicate a function is not __declspec(nothrow)

void function(int x) throw (int)
{
if(x == 1) 
throw 1.5;
}


注:在g++中并未警告。

对于函数指针,例如:

#include <iostream>
using namespace std;
void function(int x)throw(int)
{
if(x == 1)
throw 1;
}
int main()
{
void (*fp)(int)throw(char);
fp = function;
fp(1);
}


同样的,在g++中没有警告,但在vc8中提出警告:

warning C4290: C++ exception specification ignored except to indicate a function is not __declspec(nothrow)

pan>

<补充>
异常规范违例,例子程序如下:  

#include <iostream> 
using namespace std; 
class A 
{ 
};
void function(int x)throw(int) 
//void function(int x)throw(A*) 
{ 
if(x == 1) 
throw new A; 
}
void test() throw (A* ) 
{ 
//void (*fp)(int)throw(A); 
void (*fp)(int)throw(int); 
fp = function; 
try{ 
fp(1); 
}catch(int) 
{ 
cout << "test" << endl; 
throw; 
} 
}
int main() 
{ 
try{ 
test(); 
}catch(A*){ 
cout << "test in main" <<endl; 
} 
return 0; 
} 


这个代码在vc8和g++环境中的运行结果不同?

<
补充>
1.
异常处理仅仅通过类型而不是通过值来匹配的,否则又回到了传统的错误处理技术上去了,所以catch块的参数可以没有参数名称,只需要参数类型,除非要使用那个参数。
2.
虽然异常对象看上去像局部对象,但并非创建在函数栈上,而是创建在专用的异常栈上,因此它才可以跨接多个函数而传递到上层,否则在栈清空的过程中就会被销毁。
3.
函数原型中的异常说明要与实现中的异常说明一致,否则容易引起异常冲突。由于异常处理机制是在运行时有异常时才发挥作用的,因此如果函数的实现中抛出了没有在其异常说明列表中列出的异常,则编译器并不能检查出来。但是当运行时如果真的抛出了这样的异常,就会导致异常冲突。因为你没有提示函数的调用者:该函数会抛出一种没有被说明的即不期望的异常,于是异常处理机制就会检测到这个冲突并调用标准库函数unexcepted(),unexcepted()的默认行为就是调用terminate()来结束程序。
实际工作中使用set_unexcepter()来预设一个回调函数。
4.
当异常抛出时局部对象如何释放?
Bjarne Stroustrup
引入了“resource acquistion is initialization”思想,异常处理机制保证:所有从try到throw语句之间构造起来的局部对象的析构函数将被自动调用,然后清退堆栈(就像函数正常退出一样)。如果一直上溯到main函数后还没有找到匹配的catch块,那么系统调用terminate()终止整个程序,这种情况下不能保证所有局部对象会被正确地销毁。
5.catch
块的参数应采用引用传递而不是值传递,不仅可以提高效率,还可以利用对象的多态性。另外,派生类的异常扑获要放到父类异常扑获的前面,否则,派生类的异常无法被扑获。catch(void *)要放到catch(...)前面。
6.
编写异常说明时,要确保派生类成员函数的异常说明和基类成员函数的异常说明一致,即派生类改写的虚函数的异常说明至少要和对应的基类虚函数的异常说明相同,甚至更加严格,更特殊。

西电微机系统课程设计——步进电机开环控制系统设计 西电微机系统课程设计——步进电机开环控制系统设计 一、课程设计目的 1.掌握微机系统总线与各芯片管脚连接方法,提高接口扩展硬件电路的连接能力。 2.加深对 A/D 和并行接口芯片的工作方式和编程方法的理解。 3.搞懂步进电机的工作原理及控制方式,掌握开环控制系统的设计思路和实现方法。 二、课程设计的内容 手动调节电位器旋钮(0V~5V),通过 ADC0809 模拟输入水库水位 0 米~50 米,CPU收到水位信号后,根据水位高度控制步进电机(水闸)进行调节。 三、系统功能与设计要求 基本功能要求 手 阅读详情

相关推荐

raw_count、tpm、fpkm、rpkm如何选择

转录组测序中常见的数据类型有:raw_count、tpm、fpkm、rpkm。本文进行简单辨析: 一、概念 1 raw_count RNA-seq数据中,raw_count一般是指mapped到基因外显子区域的reads数目。比如说htseq,STAR,或者RSEM等NGS分析流程计算产生的counts值。其中RSEM(RNA-Seq by Expectation-Maximization),考虑到一条read 可能会匹配多个exon位置,故而其产生的为expected_count。 2 TPM

weixin_59289660的博客 1万+

C++ 异常处理 入门

C++ 异常处理 入门异常:程序执行期间,可检测到的不正常情况。例如:0作除数;数组下标越界;打开不存在的文件;远程机器连接超时;malloc失败等等。程序的两种状态:正常状态和异常状态,发生不正常情况后,进入异常状态,从当前函数开始,按调用链的相反次序,查找处理该异常的程序片断。1.throw 表达式语义:用表达式的值生成一个对象(异常对象),程序进入异常状态。T

坚持,才是力量.老实做人,踏实做事. 3万+

2017阿里内推笔试题--算法工程师(运筹优化)

2017阿里内推笔试题–算法工程师(运筹优化)题目沐哲是一个菜鸟仓库的一个拣货员,但他有非常个怪异的习惯。每次拣货的重量都要比之前拣的一个轻,每次拣到货后都可以得到1块钱,沐哲想知道这样最多能赚多少钱 32 34 7 33 21 2 13 12 3 11 26 36 16 30 22 1 24 14 20 23 25 5 19 29 27 15 9 17 31 4 6 18 8 10 3

shawpan的专栏 1万+

处理vs2005警告错误

对das 2.0项目的所有工程全面检查编译警告错误,处理记录汇集成本文. 此前的项目没有有意识地对警告进行处理,因此编译时经常报出大量的警告. 除了不清爽的感觉外,无视警告可能漏掉了对改进程序有价值的线索。 本文列举了所遇到的几乎全部的警告. 对这些警告的处理方式可以应用到其它项目,也包括das从中继承过来的. C4018 warning C4018: ' 统一变量类型声

wherwh的专栏 4337

电源工程师必看:平均电流模式BUCK双环控制详解(从传递函数到Psim仿真)

本文详细解析了平均电流模式BUCK变换器的双环控制策略,从传递函数推导到Psim仿真实现。针对电源工程师关注的环路设计和稳定性问题,深入比较了电压模式、峰值电流模式和平均电流模式的优缺点,并提供了12V/3A BUCK变换器的完整设计案例,帮助工程师掌握平均电流控制这一中高功率应用的首选方案。

weixin_42696271的博客 398

香橙派5B-RK3588-NPU内核升级至0.9.8:RKLLM多模态部署实战

本文详细介绍了香橙派5B-RK3588设备NPU内核升级至0.9.8版本的完整流程,重点讲解了升级的必要性、两种升级方案(预编译包安装与自行编译内核)以及RKLLM SDK的安装配置。通过实战演示多模态模型转换与推理,显著提升AI计算性能,为嵌入式AI部署提供实用指南。

salt9的博客 1025

三十五、异常(二)异常和继承、异常和指针、异常规格说明、标准库异常层次

一、异常与继承 如果异常类型为C++的类,并且该类有其基类,则应该将派生类的错误处理程序放在前面,基类的错误处理程序放在后面。(否者派生类的异常会被基类类型捕获,而异常要求每种类型捕获对应类型的异常) 示例: #include #include using namespace std; class MyException { public: MyException(const

tianttt的专栏 695

计算机考研复试面试常问问题 数据结构篇(下)

计算机考研复试面试常问问题 数据结构篇(下) 使用前需知(拒绝白嫖,如果对你有帮助,你只需点个赞就行): 注意:有人在闲鱼上盗卖我的资料,而且还有很多同学买了,请各位擦亮双眼,我是整理出来免费分享给大家的! 大家请多点赞和评论,这样后面的同学更容易百度到,不至于被人盗卖,我就不加水印影响大家使用了! 第一次整理,度不好控制,有不好的地方希望大家理解,后面可能会改进,造福今年之后的同学们! ...

程序员宝藏的博客 1万+

C++ Exception Specification ignored

我很菜,以前一直没有注意,类函数如有异常申明,会有C++ Exception Specification ignored警告.MS说,VC5以上版本在相应行末尾多加个;号;如:class CTest{public: CTest() throw(DWORD);;virtual ~CTest() throw(DWORD);;} 

tiewen的专栏 1330

NV 英伟达2022数字芯片笔试题

作者:数字IC打工人 链接:【开卷】第27期 NV 英伟达2022数字芯片笔试题_笔经面经_牛客网 来源:牛客网 1、Single Choice: Given thefollowing FIFO and rules, how deep does the FIFO need to be to preventunderflow or overflow? RULES: clk_A=25MHz; clk_B=100MHz; en_B is periodically asserted: period.

weixin_44072819的博客 6387

以太网物理层协议整理(2)-万兆以太网

在万兆以太网标准化过程中,IEEE和10GEA(万兆以太网联盟)是两个最重要的组织。 万兆以太网标准和规范都比较繁多,在标准方面,首先有2002年的IEEE 802.3ae,后来也不断有新的万兆以太网规范推出,如2006年的IEEE 802.3an标准(10GBase-T)就推出了基于双绞铜线的万兆以太网规范,同样的IEEE 802.3aq标准推出了基于光纤的10GBase-LRM;2007年的

NowOrNever 3万+

C++编程技术之 异常处理(下)

标准异常: 使用标准库定义的异常要比先前的自己创建异常类方便得多,当然,也可以从标准异常类中派生出自己的类。 所有的标准异常都是从exception类派生的,该类定义在中,主要的两个派生类为logic_error和runtime_error,这两个类定义在中(这个头文件包含exception)。logic_error描述程序中出现的逻辑错误,如传递无效的参数。runtime_error描述无法

小梦馆 1028

YOLOv8改进,YOLOv8添加DCNv4可变性卷积(windows系统成功编译),全网最详细教程

DCNv4通过两项关键增强解决了其前身DCNv3的局限性:1. 移除空间聚合中的softmax归一化,以增强其动态特性和表达能力;2. 优化内存访问以最小化冗余操作,从而加速计算。这些改进使得DCNv4相比DCNv3显著加快了收敛速度,并且处理速度大幅提升,前向传播速度超过三倍。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 6469

PHP-CPP异常处理机制:从C++到PHP的错误传递终极指南

PHP-CPP是一个强大的C++库,它允许开发者创建高效的PHP扩展,将C++的性能优势与PHP的灵活性完美结合。在开发PHP扩展时,异常处理是确保代码健壮性和可靠性的关键环节。本文将深入探讨PHP-CPP的异常处理机制,从C++异常的抛出到PHP错误的传递,为你提供一套完整的错误处理解决方案。 ## 🧩 PHP-CPP异常体系核心组件 PHP-CPP提供了一套完善的异常处理体系,主要包含以

gitblog_00507的博客 539

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Cpp_异常处理

一、为什么需要异常?1.程序不可能不出错2.传统的错误处理机制存在缺陷 1)通过返回值表示错误 缺点:错误处理流程比较复杂,逐层判断,代码臃肿。 优点:函数调用路径中所有的局部对象(栈对象)都能被右花括号正确地析构,不会内存泄漏。 2)通过远程跳转处理错误优点:不需要逐层判断,一步到位处理错误,代码精炼。 缺点:函数调用路径中的局部对象失去被析构机会,形成内存泄漏。3.C++的异常结合两种

Jerry的专栏 2502

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C++ 异常处理

C++标准库当中的异常也是一个基础体系,其中exception就是各个异常类的基类,我们可以在程序中使用这些标准的异常,它们之间的继承关系如下:std::exception 该异常是所有标准C++异常的父类。std::bad_alloc 该异常可以通过new抛出。std::bad_cast 该异常可以通过dynamic_cast抛出。std::bad_exception 这在处理C++程序中无法预期的异常时非常有用。

风间琉璃的博客 8721

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C++的异常处理

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

大黑暗天 的专栏 2万+

【c++】异常处理

当程序在运行过程中出现问题,没有达到理想效果时,异常可以帮助我们对这些问题进行通信并做出相应的处理,将问题的检测与解决问题的过程分离开,更好地应对大型项目可能出现的各种情况。相比于C语言处理错误的方式--返回错误码,我们在c++中,遇到异常时可以抛出一个对象,该对象所携带的错误信息可以更加全面。本篇文章,我们主要学习了异常的使用方法及其处理机制。相比c语言错误码的方式,c++的异常可以更加全面地处理程序出现的问题。但异常也有些缺点,例如造成程序执行混乱,内存泄漏等等。

2301_80955819的博客 1657

Cpp(六) 异常处理Exception

文章目录C++ 异常处理#1 环境#2 开始#2.1 格式#2.2 异常类型#2.3 自定义异常 C++ 异常处理 #1 环境 C++14 CMake 3.17 macOS 10.15.5 Clion #2 开始 #2.1 格式 格式: try{ // 抛异常 throw ExceptionType("xxx"); }catch( ExceptionType1 e1 ){ // ExceptionType1异常 // 异常处理 }catch( ExceptionType2 e2

Auto 1623

I异常处理.cpp

本文深入浅出地讲解了 C++ 异常处理机制,涵盖 try - catch - throw 的基本用法、常见异常类型,并通过文件读取和电商订单系统案例,展示如何在实战中优雅应对各种错误场景。同时强调异常处理对程序健壮性、用户体验、资源管理及代码可维护性的重要性,助你掌握这一编程 “利器”。

m0_66709139的博客 1200

C++异常处理完全指南:CPP-Crash-Course中的错误处理最佳实践

C++异常处理是现代C++开发中不可或缺的错误处理机制,本指南将从CPP-Crash-Course项目出发,详细介绍异常处理的核心概念、使用方法和最佳实践,帮助开发者构建更健壮的C++应用程序。 ## 为什么异常处理对C++开发至关重要 在C++程序开发过程中,错误处理是保证程序稳定性和可靠性的关键环节。传统的错误码返回方式存在诸多局限,而异常处理机制提供了一种更优雅、更灵活的错误处理方案。C

gitblog_00521的博客 798

c和cpp的异常处理

try-catch`结构是用于异常处理的,并且通常是在C++或其他高级语言中使用。在C语言中,异常处理通常通过返回错误代码和使用`setjmp`和`longjmp`函数来实现。在这个例子中,`setjmp`用于保存当前的执行环境,如果调用`longjmp`,则程序会返回到`setjmp`的调用点,并从那里继续执行。这种方法可以模拟类似`try-catch`的行为,但需要手动管理。在C++中,`try-catch`语句用于异常处理。- 如果没有匹配的`catch`块,程序将终止。

cocofu的博客 597

【C++】异常处理

关于C++中的异常

2303_80828380的博客 1546

C++ 异常处理总结

一、 参考文献: 【1】C++异常处理:https://www.runoob.com/cplusplus/cpp-exceptions-handling.html

灰太狼的小秘密 3701

异常处理.cpp

// 异常处理.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "异常处理.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #

autumn20080101的专栏 733
上一篇: 关于C++中模板中的typename和class的区别比较
下一篇: C语言中sizeof与strlen区别
seadplus
博客等级 码龄15年 57粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值