赞
踩
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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。