linux编程我爱编程

c语言实现异常处理

2018-05-26  本文已影响125人  MagicDong

一、异常的概念

二、异常处理机制

异常都被认为是一种很优雅的处理错误的机制,异常处理的核心思想是把功能模块代码与系统中可能出现错误的处理代码分离开来,以此来达到使我们的代码组织起来更美观、逻辑上更清晰,并且同时从根本上来提高我们软件系统长时间稳定运行的可靠性。

三、c++ 异常处理机制

C++ 异常处理涉及到三个关键字:trycatchthrow

throw: 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的。
catch: 在您想要处理问题的地方,通过异常处理程序捕获异常。catch 关键字用于捕获异常。
try: try 块中的代码标识将被激活的特定异常。它后面通常跟着一个或多个 catch 块。

#include <iostream>
using namespace std;
//抛出一个异常时 
double division(int a, int b)
{
   if( b == 0 )
   {
      //throw了一个exception对象
      throw "Division by zero condition!";
   }
   return (a/b);
}
 
int main ()
{
   int x = 50;
   int y = 0;
   double z = 0;
 //进行异常的捕获
   try {
       z = division(x, y);
       cout << z << endl;
   }catch (const char* msg) {
       cerr << msg << endl; //打印异常信息
   }
 
   return 0;
}

四、c 异常处理机制

常见exit()函数

printf("文件打开失败,错误码:%d\n",errno);

注:即使在C++中也保留了goto关键字,但是一般不建议在应用程序中使用,因为goto语句能破坏程序的结构化设计,使代码难于测试,且包含大量goto的代码模块不易理解和阅读。它一直遭结构化程序设计思想所抛弃。

#include<stdio.h>
#include<stdlib.h>
int main(){
    int a = 0;
    int b = 0;
    printf("请输入两个值:\n");
    printf("a = ");
    scanf("%d",&a);
    printf("b = ");
    scanf("%d",&b);
    if(b==0){
        goto Error;
    }
    printf("a/b = %d\n",a/b);
    return 0;
Error:
    printf("除数不能为0,程序异常退出!\n");
    exit(-1);
}
  1. 首先设置一个跳转点(setjmp() 函数可以实现这一功能)
  2. 然后在其后的代码中任意地方调用 longjmp() 跳转回这个跳转点上,以此来实现当发生异常时,转到处理异常的程序上。

setjmp() 为跳转返回保存现场并为异常提供处理程序,longjmp() 则进行跳转(抛出异常),setjmp() 与 longjmp() 可以在函数间进行跳转,这就像一个全局的 goto 语句,可以跨函数跳转。

#include<stdio.h>
#include<setjmp.h>
 
jmp_buf mark;
 
int Div(int a,int b){
    if(b==0){
        longjmp(mark,1);  //会使state = 1
    }
    return a/b;
}
int main(){
    int State = setjmp(mark);   //保存寄存器相关信息,初始值为0
    if(State==0){
        Div(4,0);
    }else{
        switch(State){
            case 1:
                printf("除0异常!\n");
        }
    }
    return 0;
}

setjmp函数用于保存程序的运行时的堆栈环境,接下来的其它地方,你可以通过调用longjmp函数来恢复先前被保存的程序堆栈环境。当 setjmp和longjmp组合一起使用时,它们能提供一种在程序中实现“非本地局部跳转”("non-local goto")的机制。并且这种机制常常被用于来实现,把程序的控制流传递到错误处理模块之中;或者程序中不采用正常的返回(return)语句,或函数的正常调用等方法,而使程序能被恢复到先前的一个调用例程(也即函数)中。

上一篇 下一篇

猜你喜欢

热点阅读