c,c++异常处理

来源:互联网 发布:淘宝专业版一个月50 编辑:程序博客网 时间:2024/06/04 19:04


C++语言异常处理机制:

C++异常机制使用了三个新的关键字  (SEH(结构化异常处理))

try    ──标识可能出现的异常代码段

throw  ──抛出一个异常

catch  ──标识处理异常的代码段

 

提示:

 使用异常处理将带来更多的系统开销。因此慎用异常。

二、抛出异常

throw

throw必须在 try代码块中.后边跟的值决定抛出异常的类型。

三、捕获异常

catch  

出现在try代码块后,后边跟的数据决定捕获的类型

catch(...) //表示捕获所有异常

#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>#include<stack>#include<queue>#include<algorithm>#define inf 0x3f3f3f3fusing namespace std;int main(){    int a=1,b=0;    try    {        if(b==0)            throw;        cout<<a/b<<endl;    }    catch(...)//...指的是捕获所有异常    {        b=1;        cout<<a/b<<endl;    }    return 0;}

C++异常处理过程:

,C++ 在语言层上便添加了异常处理机制,使用 try 块来包含那些可能出现错误的代码,你可以在 try 块代码中抛出异常,C++ 使用 throw 来抛出异常。抛出异常后,将转到异常处理程序中执行,C++ 使用 catch 块来包含那些处理异常的代码,catch 块可以接收不同类型的异常。需要说明的是,throw 一般不在 try 块内的代码中抛出异常,try 块内的代码调用了别的函数,如函数A,函数A 又调用了函数 B,throw 可以在函数B中抛出异常,或者更深的函数调用层,无论如何,只要有异常抛出,程序将转到 catch 处执行。

 C中使用setjmp()和longjmp()函数去模拟这一功能

首先调用 setjmp() 函数来初始化 jmp_buf 结构变量 jmpb,setjmp() 为跳转返回保存现场并为异常提供处理程序,可以两次跳转,第一次是初始化时,返回零,第二次遇到 longjmp() 函数调用后,longjmp() 函数使 setjmp() 函数发生第二次返回,返回值由 longjmp() 的第二个参数给出(整型,这时不应该再返回零)。

longjmp() 则进行跳转(抛出异常),longjmp() 的第一个参数便是 setjmp() 初始化的 jmpb,若想跳转回刚才设置的 setjmp() 处,则 longjmp() 函数的第一个参数是 setjmp() 所初始化的 jmpb 这个异常,longjmp() 函数的第二个参数是传给 setjmp() 的第二次返回值。

#include<stdio.h>#include<conio.h>#include<setjmp.h>jmp_buf Jump_Buffer;//定义一个全局的异常#define try if(!setjmp(Jump_Buffer))#define catch else#define throw longjmp(Jump_Buffer,1)//setjmp() 第二次将返回1void test(int x){    if(x==10)        throw;    printf("输入合法");}int main(){    //setjmp() 第一次调用初始化后返回0,取非为真,则执行 try 块内的代码,当因为调用 longjmp() 抛出异常而导致    //setjmp() 第二次返回时(程序将会转到 setjmp() 函数处返回,这时,这时应该执行的是异常处理代码。longjmp()    //使 setjmp() 函数返回非0,if(!setjmp(JumpBuffer)) 中将值取非则为假,是以,异常处理放在其后应该使用一个 else:    int x;    try    {        scanf("%d",&x);        test(x);    }    catch    {        printf("输入错误");    }    return 0;}





原创粉丝点击