当前位置:   article > 正文

c,c++异常处理_c ++ exception的使用

c ++ exception的使用

 

C++语言异常处理机制

 

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

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

throw  ──抛出一个异常

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

 

提示:

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

二、抛出异常

throw

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

三、捕获异常

catch  

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

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

 

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdlib>
  4. #include<cstdio>
  5. #include<stack>
  6. #include<queue>
  7. #include<algorithm>
  8. #define inf 0x3f3f3f3f
  9. using namespace std;
  10. int main()
  11. {
  12. int a=1,b=0;
  13. try
  14. {
  15. if(b==0)
  16. throw;
  17. cout<<a/b<<endl;
  18. }
  19. catch(...)//...指的是捕获所有异常
  20. {
  21. b=1;
  22. cout<<a/b<<endl;
  23. }
  24. return 0;
  25. }


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() 的第二次返回值。

 

  1. #include<stdio.h>
  2. #include<conio.h>
  3. #include<setjmp.h>
  4. jmp_buf Jump_Buffer;//定义一个全局的异常
  5. #define try if(!setjmp(Jump_Buffer))
  6. #define catch else
  7. #define throw longjmp(Jump_Buffer,1)
  8. //setjmp() 第二次将返回1
  9. void test(int x)
  10. {
  11. if(x==10)
  12. throw;
  13. printf("输入合法");
  14. }
  15. int main()
  16. {
  17. //setjmp() 第一次调用初始化后返回0,取非为真,则执行 try 块内的代码,当因为调用 longjmp() 抛出异常而导致
  18. //setjmp() 第二次返回时(程序将会转到 setjmp() 函数处返回,这时,这时应该执行的是异常处理代码。longjmp()
  19. //使 setjmp() 函数返回非0,if(!setjmp(JumpBuffer)) 中将值取非则为假,是以,异常处理放在其后应该使用一个 else:
  20. int x;
  21. try
  22. {
  23. scanf("%d",&x);
  24. test(x);
  25. }
  26. catch
  27. {
  28. printf("输入错误");
  29. }
  30. return 0;
  31. }

 

 

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/714969
推荐阅读
相关标签
  

闽ICP备14008679号