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++中的异常处理(上)的更多相关文章

  1. C++中的异常处理(上)

    C++内置了异常处理的语法元素try... catch ...-try语句处理正常代码逻辑-catch语句处理异常情况-try语句中的异常由对应的catch语句处理 try { ,); } catch ...

  2. 关于C#中async/await中的异常处理(上)-(转载)

    在同步编程中,一旦出现错误就会抛出异常,我们可以使用try…catch来捕捉异常,而未被捕获的异常则会不断向上传递,形成一个简单而统一的错误处理机制.不过对于异步编程来说,异常处理一直是件麻烦的事情, ...

  3. 关于C#中async/await中的异常处理(上)

    关于C#中async/await中的异常处理(上) 2012-04-11 09:15 by 老赵, 17919 visits 在同步编程中,一旦出现错误就会抛出异常,我们可以使用try…catch来捕 ...

  4. 【repost】JS中的异常处理方法分享

    我们在编写js过程中,难免会遇到一些代码错误问题,需要找出来,有些时候怕因为js问题导致用户体验差,这里给出一些解决方法 js容错语句,就是js出错也不提示错误(防止浏览器右下角有个黄色的三角符号,要 ...

  5. java 中的异常处理

    一. 异常的概念和Java异常体系结构  异常是程序运行过程中出现的错误.本文主要讲授的是Java语言的异常处理.Java语言的异常处理框架,     是Java语言健壮性的一个重要体现. Java把 ...

  6. Delphi中的异常处理(10种异常来源、处理、精确处理)

    一.异常的来源 在Delphi应用程序中,下列的情况都比较有可能产生异常. 1.文件处理 2.内存分配 3.windows资源 4.运行时创建对象和窗体 5.硬件和操作系统冲突 6.网络问题 7.数据 ...

  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系列教程]的一部分,如果您是第一次看本系列教程,请先看前面的内 ...

  8. T-SQL编程中的异常处理-异常捕获(catch)与抛出异常(throw)

    本文出处: http://www.cnblogs.com/wy123/p/6743515.html T-SQL编程与应用程序一样,都有异常处理机制,比如异常的捕获与异常的抛出,本文简单介绍异常捕获与异 ...

  9. web应用中的异常处理

    楼主前几天写了一篇“Java子线程中的异常处理(通用)”文章,介绍了在多线程环境下3种通用的异常处理方法. 但是平时大家的工作一般是基于开发框架进行的(比如Spring MVC,或Spring Boo ...

  10. C#多线程中的异常处理

    常规Thread中处理异常 使用Thread创建的子线程,需要在委托中捕捉,无法在上下文线程中捕捉 static void Main(string[] args) { ThreadStart thre ...

随机推荐

  1. 6、Lambda表达式(推荐使用)

    Lambda表达式(匿名的函数对象),是C++11增加的新特性,Qt配合信号一起使用,非常方便. pro项目文件中引入了这种特性: CONFIG += c++11 通过connect来了解Lambda ...

  2. SpringBoot整合Elastic-job(详细)

    一 作业分片1.分片概念作业分片是指任务的分布式执行,需要将一个任务拆分为多个独立的任务项,然后由分布式的应用实例分别执行某一个或几个分片项.例如:Elastic-Job快速入门中文件备份的例子,现有 ...

  3. stack和queue小讲

    由于stack和queue没有太多新的东西,故在此只把API拿出来小说一下,自己也记得比较牢靠一些. stack常用API push(int elem); //向栈顶添加元素 pop(); //从栈顶 ...

  4. Java回调

    最近在看Spring的JdbcTemplate,有碰到很多的回调场景,在这里做一个笔记. 示例: 公司的经理出差时打电话给你让你帮他处理件事情,但不能一直通着电话,于是他让你办好事情后打电话告诉他一声 ...

  5. ZOJ3649 Social Net

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3649 这题倍增维护信息之多,也能算是一道毒瘤题了-- 解题思路 ...

  6. codefroces Round #201.a--Difference Row

    Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Description You wa ...

  7. Oracle用函数或PIVOT实现行转列

    原数据: 目标数据: 实现代码: SELECT YEAR AS "年", SUM (DECODE (QUATER, 1, RATE, 0)) AS "季度一", ...

  8. C++入门经典-例4.6-使用重载函数

    1:代码如下: // 4.6.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...

  9. note:开源许可证之间的区别

    最近接触开源项目比较多,关注一下许可证的问题. 饱受诟病的病毒式copyleft就是GPL了.. ref:http://code.csdn.net/news/2819582 ref:http://ww ...

  10. Mybaits 分页插件应用

    mybaits 分页插件省去了很多麻烦,接下来介绍如果应用分页插件 1.首先导入pagehelper.jar和jsplparser 2 在mybaits.xml中配置 <plugins> ...