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. sh_07_元组遍历

    sh_07_元组遍历 info_tuple = ("zhangsan", 18, 1.75) # 使用迭代遍历元组 for my_info in info_tuple: # 使用格 ...

  2. 使用 Reactjs + Mobx + React-Router 开发项目时 VSCode 编辑器报警 TS 相关的问题(提示experimentalDecorators )

    vscode 对于 JS support 的支持需要配置,在项目根目录下创建一个 jsconfig.json 文件,把以下内容贴入后保存,重启项目即可生效(去掉提示). { "compile ...

  3. vue router 报错:NavigationDuplicated {_name: "NavigationDuplicated", name: "NavigationDuplicated"}

    https://blog.csdn.net/weixin_43202608/article/details/98884620

  4. C++入门经典-例6.18-数组的动态分配,动态获得斐波那契数列

    1:有时在获得一定的信息之前,我们并不确定数组的大小.动态分配数组则可以使用变量作为数组的大小,使数组的大小符合我们的要求. 2:科普一下斐波纳契数列:斐波那契数列指的是这样一个数列 1, 1, 2, ...

  5. C++入门经典-例5.10-指针作为返回值

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

  6. Ruby小白入门笔记之 <Gemfile 文件>

    因为初学Ruby,四处查资料无果,才来的贴出亲自试过的操作,覆盖整个个人入门笔记博客中,故所有的操作,都以最明了的方式阐述,当你创建完一个新的Rails应用后,你发现JAVA中我们可以编写maven聚 ...

  7. getApplication()和getApplicationContext()区别

    二者使用结果相同,我们写个代码分别打印二者返回结果,发现两个方法获取的是同一个对象. public class MainActivity extends Activity { @Override pr ...

  8. Jmeter响应数据中文乱码|响应内容显示乱码

    1.使用jmeter进行接口调用时出现返回数据乱码,如图示 原因是jmeter默认按照ISO-8859-1解析响应的数据. 2.所以需要修改bin目录下的jmeter.properties文件: 具体 ...

  9. [原创]关于类似方程x+y+z=P的解的总解

    1:如果x,y,z>=0,则直接插板法c(P+3,3-1)2:如果x,y,z均有下界a1,a2,a3,则求解方程x+y+z=P-a1-a2-a33:如果x,y,z均有上界的自然数,则使用容斥定理 ...

  10. Logistic回归基础篇之梯度上升算法

    代码示例: import numpy as np import matplotlib.pyplot as plt def loadDataSet(): dataMat = [];labelMat = ...