C++中的异常处理(上)
1,C++ 内置了异常处理的语法元素 try ... catch ...;
1,try 语句处理正常代码逻辑;
2,catch 语句处理异常情况;
3,try 语句中的异常由对应的 catch 语句处理;
1,代码示例:
try
{
double r = divide(, ); // divide() 函数里面产生除 0 异常,于是 divide() 函数就会将这个异常抛出到调用的地点,这个地点正好在 try 语句块中,其会将捕捉到的异常扔给下面的 catch 代码块,catch 代码块就可以将除 0 异常捕捉到,于是打印 Divided by zero ...;
}
catch(...)
{
cout << "Divided by zero ..." << endl;
}
2,C++ 通过 throw 语句抛出异常信息:
1,代码示例:
double divide(double a, double b)
{
const double delta = 0.000000001;
double ret = ; if( !((-delta < b) && (b < delta)) )
{
ret = a / b;
}
else
{
throw ; // 0 这个字面值常量代表当前的异常元素,表示产生除 0 异常; 异常元素可以是一个值、一个对象、一个字符串等; 扔出异常元素后,divide() 就会立即返回到调用点;
} return ret;
}
2,C++ 中 throw 这个新的关键字就是用来仍出异常元素的,我们简称为“异常”,每一个异常都需要被 catch 语句来处理;
3,C++ 异常处理分析:
1,throw 抛出的异常必须被 catch 处理:
1,当前函数能够处理异常,程序往下执行;
2,当前函数无法处理异常,则函数停止执行,并返回;
1,返回是异常返回,和正常返回不一样;
2,异常产生后的函数返回是没有返回值的;
2,未被处理的异常会顺着函数调用栈向上传播,知道被处理为止,否则程序将停止执行;

3,C++ 异常处理初探编程实验:
#include <iostream>
#include <string> using namespace std; double divide(double a, double b)
{
const double delta = 0.000000000000001;
double ret = ; if( !((-delta < b) && (b < delta)) )
{
ret = a / b;
}
else
{
throw ;
} return ret;
} int main(int argc, char *argv[])
{
try
{
double r = divide(, ); // 扔出异常后,divide() 自身没有 try...catch...,不能处理异常,所以 divide() 这个函数就会立即的停止并且带着异常元素返回到调用点,而 main() 函数中当也没有try...catch... 语句时,异常向上传播,main() 已经是第一个函数了,则导致整个程序异常停止,编译器显示:terminate called after throwing an instance of 'int',已放弃;当 main() 中包含 try...catch... 语句时,程序正常打印:Divided by zero...; cout << "r = " << r << endl;
}
catch(...) // “...” 表示见下分析;
{
cout << "Divided by zero..." << endl;
} return ;
}
4,同一个 try 语句可以跟上多个 catch 语句:
1,catch 语句可以定义具体处理的异常类型;
2,不同类型的异常由不同的 catch 语句负责处理;
3,try 语句中可以抛出任何类型的异常;
1,try 语句块用于放置可能产生异常的代码,工程里面一般都习惯将正常功能逻辑代码放在 try 语句块中,然后后面跟上多个 catch 语句;
2,可以是一个 int、字符串、对象;
4,catch(...) 用于处理所有类型的异常;
1,一般情况作为最后出场的语句块;
5,任何异常都只能被捕获(catch)一次;
1,只要被 catch 一次,其它的 catch 就没有捕获机会了;
5,异常处理的匹配规则:
1,示意图:

2,try 语句块中直接通过 throw 扔出整型异常;
3,扔出后发现是在 catch 语句块中,然后这个异常就会进行 catch 语句块的匹配;
4,从上向下严格匹配每个 catch 它所需要捕获的异常类型;
5,匹配 catch 语句块所标识的类型时,是不会进行任何的类型转换的;
6,如果说不能够严格匹配上,那么当前的异常没有被捕获,当前的函数就会立即的停止执行,并且带着这个异常沿着函数调用栈顺序的返回;
6,异常类型匹配编程实验:
#include <iostream>
#include <string> using namespace std; void Demo1()
{
try
{
throw 'c';
}
catch(char c)
{
cout << "catch(char c)" << endl;
}
catch(short c)
{
cout << "catch(short c)" << endl;
}
catch(double c)
{
cout << "catch(double c)" << endl;
}
catch(...) // 当把它放到其它 catch 语句块前面的时候,编译器显示:error: '...' handler must be the last handler for its try block;
{
cout << "catch(...)" << endl;
}
} void Demo2()
{
throw "D.T.Software; // 两个分开执行的;
throw string("D.T.Software");
} int main(int argc, char *argv[])
{
Demo1(); try
{
Demo2(); // 认为它可能产生字符串异常,所以将它放到了这里;
}
catch(char* s)
{
cout << "catch(char *s)" << endl;
}
catch(const char* cs) // 没有这个 catch 语句块时,第一个异常执行后编译器显示:terminate called after throwing an instance of 'char const *';
{
cout << "catch(const char *cs)" << endl;
}
catch(string ss)
{
cout << "catch(string ss)" << endl;
} return ;
}
7,小结:
1,C++ 中直接支持异常处理的概念;
2,try ... catch ... 是 C++ 中异常处理的专用语句;
3,try 语句处理正常代码逻辑,catch 语句处理异常情况;
4,同一个 try 语句可以跟上多个 catch 语句;
5,异常处理必须严格匹配,不进行任何的类型转换;
C++中的异常处理(上)的更多相关文章
- C++中的异常处理(上)
C++内置了异常处理的语法元素try... catch ...-try语句处理正常代码逻辑-catch语句处理异常情况-try语句中的异常由对应的catch语句处理 try { ,); } catch ...
- 关于C#中async/await中的异常处理(上)-(转载)
在同步编程中,一旦出现错误就会抛出异常,我们可以使用try…catch来捕捉异常,而未被捕获的异常则会不断向上传递,形成一个简单而统一的错误处理机制.不过对于异步编程来说,异常处理一直是件麻烦的事情, ...
- 关于C#中async/await中的异常处理(上)
关于C#中async/await中的异常处理(上) 2012-04-11 09:15 by 老赵, 17919 visits 在同步编程中,一旦出现错误就会抛出异常,我们可以使用try…catch来捕 ...
- 【repost】JS中的异常处理方法分享
我们在编写js过程中,难免会遇到一些代码错误问题,需要找出来,有些时候怕因为js问题导致用户体验差,这里给出一些解决方法 js容错语句,就是js出错也不提示错误(防止浏览器右下角有个黄色的三角符号,要 ...
- java 中的异常处理
一. 异常的概念和Java异常体系结构 异常是程序运行过程中出现的错误.本文主要讲授的是Java语言的异常处理.Java语言的异常处理框架, 是Java语言健壮性的一个重要体现. Java把 ...
- Delphi中的异常处理(10种异常来源、处理、精确处理)
一.异常的来源 在Delphi应用程序中,下列的情况都比较有可能产生异常. 1.文件处理 2.内存分配 3.windows资源 4.运行时创建对象和窗体 5.硬件和操作系统冲突 6.网络问题 7.数据 ...
- 【ASP.NET Web API教程】4.3 ASP.NET Web API中的异常处理
原文:[ASP.NET Web API教程]4.3 ASP.NET Web API中的异常处理 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面的内 ...
- T-SQL编程中的异常处理-异常捕获(catch)与抛出异常(throw)
本文出处: http://www.cnblogs.com/wy123/p/6743515.html T-SQL编程与应用程序一样,都有异常处理机制,比如异常的捕获与异常的抛出,本文简单介绍异常捕获与异 ...
- web应用中的异常处理
楼主前几天写了一篇“Java子线程中的异常处理(通用)”文章,介绍了在多线程环境下3种通用的异常处理方法. 但是平时大家的工作一般是基于开发框架进行的(比如Spring MVC,或Spring Boo ...
- C#多线程中的异常处理
常规Thread中处理异常 使用Thread创建的子线程,需要在委托中捕捉,无法在上下文线程中捕捉 static void Main(string[] args) { ThreadStart thre ...
随机推荐
- Java多线程和并发(十二),Java线程池
目录 1.利用Executors创建线程的五种不同方式 2.为什么要使用线程池 3.Executor的框架 4.J.U.C的三个Executor接口 5.ThreadPoolExecutor 6.线程 ...
- sh_12_字典的遍历
sh_12_字典的遍历 xiaoming_dict = {"name": "小明", ", "} # 迭代遍历字典 # 变量k是每一次循环中 ...
- pyqt5对用qt designer设计的窗体实现弹出子窗口的示例
pyqt5对用qt designer设计的窗体实现弹出子窗口的示例 脚本专栏 python 1. 用qt designer编写主窗体,窗体类型是MainWindow,空白窗口上一个按钮.并转换成mai ...
- sqlmap自动注入1(Target完整的超级详细 如有错误望指出)
SQLmap的自动注入学习之路(1) 是通过五种sql注入漏洞的检测技术 ' and(select*from(select(sleep(20)))a)# 这是基于时间的盲注检测 看他返回的时间 可以在 ...
- mybatis逆向工程的text类型的一个小坑
数据库如果配有text的数据类型的 mybatis生成逆向工程的时候会单独将text提取出来 ByExampleWithBLOBs 会生成上面后缀的查询和修改的语句 因此查询起来会产生没有必要的麻烦, ...
- 浏览器端-W3School-JavaScript-HTML DOM:HTML DOM Document 对象
ylbtech-浏览器端-W3School-JavaScript-HTML DOM:HTML DOM Document 对象 1.返回顶部 1. HTML DOM Document 对象 Docume ...
- centos7.7下docker与k8s安装(DevOps三)
1.系统配置 centos7.7 docker 1.13.1 centos7下安装docker:https://www.cnblogs.com/pu20065226/p/10536744.html 2 ...
- python开发问题
1. pip3 ''' pip3 install --upgrade pip sudo apt-get install python3-setuptools pip3 install --upgrad ...
- 基于java config的springSecurity--session并发控制
原作地址:http://blog.csdn.net/xiejx618/article/details/42892951 参考资料:spring-security-reference.pdf的Sessi ...
- Session对象的生命周期(面试题/笔试题)
创建:第一次执行request.getSession()时创建 销毁: 1)服务器(非正常)关闭时 2)session过期/失效(默认30分钟) 问题:时间的起算点 从何时开始计算30分钟? 从不操作 ...