c++学习笔记(18.异常处理)(一)

2014-11-24 09:03:09 · 作者: · 浏览: 0

本节知识点:

1.异常与c语言的异常处理:

a. 异常就是代码中的一些特殊情况,如除法运算中除数为零的情况,还有就是一些函数中出现不符合要求的函数参数的情况,都属于异常情况! b. 在c语言中对异常的处理通常有三种方式: 第一种,最常用的就是条件判断 第二种,goto语句 第三种,longjmp()函数和setjmp()函数 条件判断的示例代码:
#include 
  
   
#include 
   
     using namespace std; int MemSet(void* dest, unsigned int length, unsigned char v) { if( dest == NULL ) { return -1; } if( length < 4 ) { return -2; } if( (v < 0) || (v > 9) ) { return -3; } unsigned char* p = (unsigned char*)dest; for(int i=0; i
    
      c.
     可见条件判断的方法,使得正常逻辑的代码和异常处理的代码混合在一起,导致代码迅速膨胀,难以维护!而goto语句和setjmp()、longjmp()函数则可以将异常处理代码放在统一的地方,与正常逻辑代码分开。
     

2.c++中的异常处理:

a. c++中有着自己的一套异常处理方式,没有使用goto语句和setjmp()、longjmp()函数,是因为它们的安全性实在是很低! b. c++中异常处理的语法 try语句块处理正常逻辑 catch语句块处理异常逻辑 throw语句引发一个异常 示例代码:
#include 
      
       
#define div_zero_error 1

using namespace std;

double div(double a, double b)
{
	if((-0.0000001
       
        注意:第一,并不是所有语句都要全部放在try或者catch语句块里面,可以放在try或者catch语句外面! 
         第二,throw语句后面,可以直接放数据,也可以放变量 
         第三,一个try语句后面可以有多个catch语句块,catch语句后面,可以只有变量类型,没有具体变量!
        
c. 当throw语句抛出一个异常的时候,首先在当前函数中看,throw语句是否在一个try语句块中,如果是则去判断这个try语句块对应的catch语句块中是否能够处理这个异常类型,如果不能处理或者throw语句不在一个try语句块中,则退出当前函数,返回到调用函数的位置看,看调用函数的语句是否在一个try语句块中,对应的catch是否能处理这个异常,不断重复返回到上层函数,直到遇到可以处理这个异常的catch语句。或者返回到了所有函数后,都无法处理抛出的这个异常,则程序异常终止!!!切记,即使异常在对应的catch语句块中完成了异常处理,程序也不能回到异常发生处或上层函数调用处继续执行了,程序只能接着处理异常的catch语句块后面继续执行!!! 如图: vcq90+uzo7nmtcTM9bz+xdC2z7HIvc+jrNPFysbU2tPa0uyzo7T6wuu/6dPr1f2zo7T6wuu/6crHt9a/qrXEo6yx49PatPrC67ncwO2jrM2syrHSsrHcw+LBy7Tzwb+1xMz1vP7F0LbPKNLyzqrDv9bW0uyzo7a8u+HT0NK7uPbX1Ly6tcS3tbvYJiMyMDU0MDujrLWxuq/K/b3hyvjKsaOs0OjSqsXQts/Kx8TH0rvW1tLss6OjrMv50tS+zbTm1Nq088G/xdC2z6OstvjH0srHw7+0zrX308O6r8r9trzSqtbY0MLF0LbPo6yyu8TctPrC67i008OjrLW81sLArLv4tPrC67Tzwb/F8tXNKaOszPW8/sXQts/W0Lbg1tbS7LOjtcTH6b/2KLy0t7W72LrDvLi49iYjMjA1NDA7tcTH6b/2KaOsv8nS1Mq508O24Lj2Y2F0Y2jT777kv+nN6rPJo6xjYXRjaMDg0M224LXEyrG68r6hwb+yu9KqyrnTw7v5sb7A4NDNo6zKudPD19S8urS0vai1xMDgwODQzaOhPC9zdHJvbmc+CiAgICAgIDxzdHJvbmc+YyYjNDM7JiM0Mzu1xNXi1tbS7LOjtKbA7dPrZ290b9PvvuQoc2V0am1wuq/K/Sm1xLHIvc+jrHRyeS4uLi4uY2F0Y2jT777ko6yxyGdvdG/T777k0qqwssirtcS24KOsyOe5+8rH08Nnb3Rv0+++5L340NDM+Neqo6zV4rj2uf2zzLj5sb6+zbK7v7zCx7qvyv21xL2o1bu6zc3L1bu5/bPMo6zL/L32vfa+zcrHzPjXqrn9yKXWtNDQtvjS0aOhtvh0aHJvd9PvvuSjrNTysrvKx6OhdGhyb3fF17P20uyzo7XEyrG68qOsyse74c3L1bvIu7rzt7W72MnPsuO6r8r9tcSjrNXi0ru149Kqschnb3RvsLLIq7bgwcujocbwwuu6r8r9ysfV/bOjveHK+LXEo6G2+MfSo6x0aHJvd8rH0ruy49K7suO1xMil0bDV0mNhdGNo0+++5KOs1NrC37yt0NTJz6Os0rLSqrHIZ290b9PvvuTH5c76uty24KOhPC9zdHJvbmc+CnRyeS4uLi4uY2F0Y2jT777ktcTKvsD9tPrC66O6CjxwcmUgY2xhc3M9"brush:java;">#include #include using namespace std; void MemSet(void* dest, unsigned int length, unsigned char v) { if( dest == NULL ) { throw -1; } if( length < 4 ) { throw -2; } if( (v < 0) || (v > 9) ) { throw -3; } unsigned char* p = (unsigned char*)dest; for(int i=0; i 注意:上面代码是c++异常处理的常规用法! 比对代码:
#include 
            
             
#include 
             
               using namespace std; int MemSet(void* dest, unsigned int length, unsigned char v) { int ret = 0; if( dest == NULL ) { return -1; } if( length < 4 ) { return -2; } if( (v < 0) || (v > 9) ) { return -3; } unsigned char* p = (unsigned char*)dest; for(int i=0; i
              
               注意:上面就是使用条件判断的异常处理方式,可见代码膨胀的样子!但是使用条件判断可以保证每一个正常逻辑的代码都得到执行,而try.....catch语句就保证不了!因为当发生throw异常的时候,代码就会跳转到catch语句块中,然后从catch语句块往后执行了!会丢失throw语句后面部分的正常逻辑代码!
               
e. 同一个try语句块可以跟上多个catch语句块,同一个try语句块可以抛出多种不同类型的异常,不同类型的异常由不同的catch语句块负责处理!异常被抛