设为首页 加入收藏

TOP

C++中的异常处理(上)(一)
2019-05-24 20:07:53 】 浏览:111
Tags:异常 处理

1,C++ 内置了异常处理的语法元素 try ... catch ...;

    1,try 语句处理正常代码逻辑;

    2,catch 语句处理异常情况;

    3,try 语句中的异常由对应的 catch 语句处理;

       1,代码示例:

1 try
2 {
3     double r = divide(1, 0);  // divide() 函数里面产生除 0 异常,于是 divide() 函数就会将这个异常抛出到调用的地点,这个地点正好在 try 语句块中,其会将捕捉到的异常扔给下面的 catch 代码块,catch 代码块就可以将除 0 异常捕捉到,于是打印 Divided by zero ...;
4 }
5 catch(...)
6 {
7     cout << "Divided by zero ..." << endl;
8 }

         

2,C++ 通过 throw 语句抛出异常信息:

    1,代码示例:

 1 double divide(double a, double b)
 2 {
 3     const double delta = 0.000000001;
 4     double ret = 0;
 5            
 6     if( !((-delta < b) && (b < delta)) )
 7     {
 8            ret = a / b;
 9     }
10     else
11     {
12            throw 0;  // 0 这个字面值常量代表当前的异常元素,表示产生除 0  异常; 异常元素可以是一个值、一个对象、一个字符串等; 扔出异常元素后,divide() 就会立即返回到调用点;
13      }
14            
15      return ret;
16 }

    2,C++ 中 throw 这个新的关键字就是用来仍出异常元素的,我们简称为“异常”,每一个异常都需要被 catch 语句来处理;

      

3,C++ 异常处理分析:

    1,throw 抛出的异常必须被 catch 处理:

       1,当前函数能够处理异常,程序往下执行;

       2,当前函数无法处理异常,则函数停止执行,并返回;

           1,返回是异常返回,和正常返回不一样;

           2,异常产生后的函数返回是没有返回值的;

    2,未被处理的异常会顺着函数调用栈向上传播,知道被处理为止,否则程序将停止执行;

    3,C++ 异常处理初探编程实验:

 1 #include <iostream>
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 double divide(double a, double b)
 7 {
 8     const double delta = 0.000000000000001;
 9     double ret = 0;
10     
11     if( !((-delta < b) && (b < delta)) )
12     {
13         ret = a / b;
14     }
15     else
16     {
17         throw 0;  
18     }
19     
20     return ret;
21 }
22 
23 int main(int argc, char *argv[])
24 {    
25     try
26     {
27         double r = divide(1, 0);  // 扔出异常后,divide() 自身没有 try...catch...,不能处理异常,所以 divide() 这个函数就会立即的停止并且带着异常元素返回到调用点,而 main() 函数中当也没有try...catch... 语句时,异常向上传播,main() 已经是第一个函数了,则导致整个程序异常停止,编译器显示:terminate called after throwing an instance of 'int',已放弃;当 main() 中包含 try...catch... 语句时,程序正常打印:Divided by zero...;
28             
29         cout << "r = " << r << endl;
30     }
31     catch(...)  // “...” 表示见下分析;
32     {
33         cout << "Divided by zero..." << endl;
34     }
35     
36     return 0;
37 }

      

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,如果说不能够严

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇洛谷 P3388 【模板】割点(割顶).. 下一篇C++中类模板的概念和意义

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目