c,c++异常处理

 

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 0x3f3f3f3f
using 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() 第二次将返回1
void 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;
}

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值