快捷搜索:   服务器  安全  linux 安全  MYSQL  dedecms

玩转setjmp与longjmp(2)


    printf("异常出现前\n\n");

    // 注意,这个函数的内部会抛出一个异常。
    test();

    throw(9, 15, "出现某某异常");

    printf("异常出现后\n\n");
    }
    catch
    {
    printf("catch块,被执行到\n");
    printf("捕获到一个异常,错误原因是:%s! err_type:%d err_code:%d\n",
    ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
    }
    end_try
    }

      同样,在上面程序中,test1()函数内抛出的异常,可以被上层main()函数中的catch block中捕获到。运行结果就不再给出了,大家可以自己编译运行一把,看看运行结果。
    另外这个异常处理框架,与C++中的异常处理模型类似,它也支持try catch块的多层嵌套。很厉害吧!还是看演示代码吧!,如下:

    #include "ceh.h"

    int main(void)
    {
    // 外层的try catch块
    try
    {
    // 内层的try catch块
    try
    {
    throw(1, 15, "嵌套在try块中");
    }
    catch
    {
    printf("内层的catch块被执行\n");
    printf("捕获到一个异常,错误原因是:%s! err_type:%d err_code:%d\n",
    ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);

    printf("外层的catch块被执行\n");
    }
    end_try

    throw(2, 30, "再抛一个异常");
    }
    catch
    {
    printf("外层的catch块被执行\n");
    printf("捕获到一个异常,错误原因是:%s! err_type:%d err_code:%d\n",
    ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
    }
    end_try
    }

      请编译运行一下,程序的运行结果如下:
      内层的catch块被执行
      捕获到一个异常,错误原因是:嵌套在try块中! err_type:1 err_code:15
      外层的catch块被执行
      捕获到一个异常,错误原因是:再抛一个异常! err_type:2 err_code:30

      还有,这个异常处理框架也支持对异常的分类处理。这一点,也完全是模仿C++中的异常处理模型。不过,由于C语言中,不支持函数名重载,所以语法上略有不同,还是看演示代码吧!,如下:

    #include "ceh.h"

    int main(void)
    {
    try
    {
    int i,j;
    printf("异常出现前\n\n");

    throw(9, 15, "出现某某异常");

    printf("异常出现后\n\n");
    }
    // 这里表示捕获异常类型从4到6的异常
    catch_part(4, 6)
    {
    printf("catch_part(4, 6)块,被执行到\n");
    printf("捕获到一个异常,错误原因是:%s! err_type:%d err_code:%d\n",
    ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
    }
    // 这里表示捕获异常类型从9到10的异常
    catch_part(9, 10)
    {
    printf("catch_part(9, 10)块,被执行到\n");
    printf("捕获到一个异常,错误原因是:%s! err_type:%d err_code:%d\n",
    ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
    }
    // 这里表示只捕获异常类型为1的异常
    catch_one(1)
    {
    printf("catch_one(1)块,被执行到\n");
    printf("捕获到一个异常,错误原因是:%s! err_type:%d err_code:%d\n",
    ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
    }
    // 这里表示捕获所有类型的异常
    catch
    {
    printf("catch块,被执行到\n");
    printf("捕获到一个异常,错误原因是:%s! err_type:%d err_code:%d\n",
    ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
    }
    end_try
    }

      请编译运行一下,程序的运行结果如下:
      异常出现前

    catch_part(9, 10)块,被执行到
      捕获到一个异常,错误原因是:出现某某异常! err_type:9 err_code:15

      与C++中的异常处理模型相似,它这里的对异常的分类处理不仅支持一维线性的;同样,它也支持分层的,也即在当前的try catch块中找不到相应的catch block,那么它将会到上一层的try catch块中继续寻找。演示代码如下:

    #include "ceh.h"

    int main(void)
    {
    try
    {
    try
    {
    throw(1, 15, "嵌套在try块中");
    }
    catch_part(4, 6)
    {
    printf("catch_part(4, 6)块,被执行到\n");
    printf("捕获到一个异常,错误原因是:%s! err_type:%d err_code:%d\n",
    ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
    }
    end_try

    printf("这里将不会被执行到\n");
    }
    catch_part(2, 3)
    {
    printf("catch_part(2, 3)块,被执行到\n");
    printf("捕获到一个异常,错误原因是:%s! err_type:%d err_code:%d\n",
    ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
    }
    // 找到了对应的catch block
    catch_one(1)
    {
    printf("catch_one(1)块,被执行到\n");
    printf("捕获到一个异常,错误原因是:%s! err_type:%d err_code:%d\n",
    ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
    }
    catch
    {
    printf("catch块,被执行到\n");
    printf("捕获到一个异常,错误原因是:%s! err_type:%d err_code:%d\n",
    ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
    }
    end_try

    }

     到目前为止,大家是不是已经觉得,这个主人公阿愚封装的在C语言环境中异常处理框架,已经与C++中的异常处理模型95%相似。无论是它的语法结构;还是所完成的功能;以及它使用上的灵活性等。下面我们来看一个各种情况综合的例子吧!代码如下:

    #include "ceh.h"

    void test1()
    {
    throw(0, 20, "hahaha");
    }

    void test()
    {
    test1();
    }

    int main(void)
    {
    try
    {
    test();
    }
    catch
    {
    printf("捕获到一个异常,错误原因是:%s! err_type:%d err_code:%d\n",
    ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
    }
    end_try

    try
    {
    try
    {
    throw(1, 15, "嵌套在try块中");
    }
    catch
    {
    printf("捕获到一个异常,错误原因是:%s! err_type:%d err_code:%d\n",
    ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
    }
    end_try

    throw(2, 30, "再抛一个异常");
    }
    catch
    {
    printf("捕获到一个异常,错误原因是:%s! err_type:%d err_code:%d\n",
    ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);

    try
    {
    throw(0, 20, "嵌套在catch块中");
    }
    catch
    {
    printf("捕获到一个异常,错误原因是:%s! err_type:%d err_code:%d\n",
    ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
    }
    end_try
    }
    end_try
    }

      请编译运行一下,程序的运行结果如下:
      捕获到一个异常,错误原因是:hahaha! err_type:0 err_code:20
      捕获到一个异常,错误原因是:嵌套在try块中! err_type:1 err_code:15
      捕获到一个异常,错误原因是:再抛一个异常! err_type:2 err_code:30
      捕获到一个异常,错误原因是:嵌套在catch块中! err_type:0 err_code:20

      最后,为了体会到这个异常处理框架,更进一步与C++中的异常处理模型相似。那就是它还支持异常的重新抛出,以及系统中能捕获并处理程序中没有catch到的异常。看代码吧!如下:

    #include "ceh.h"

    void test1()
    {
    throw(0, 20, "hahaha");
    }

    void test()
    {
    test1();
    }

    int main(void)
    {
    // 这里表示程序中将捕获浮点数计算异常
    CEH_init();

    try
    {
    try
    {
    try
    {
    double i,j;
    j = 0;
    // 这里出现浮点数计算异常
    i = 1/j ;

    test();

    throw(9, 15, "出现某某异常");
    }
    end_try
    }
    catch_part(4, 6)
    {
    printf("catch_part(4, 6)块,被执行到\n");
    printf("捕获到一个异常,错误原因是:%s! err_type:%d err_code:%d\n",
    ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
    }
    catch_part(2, 3)
    {
    printf("catch_part(2, 3)块,被执行到\n");
    printf("捕获到一个异常,错误原因是:%s! err_type:%d err_code:%d\n",
    ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);
    }
    // 捕获到上面的异常
    catch
    {
    printf("内层的catch块,被执行到\n");
    printf("捕获到一个异常,错误原因是:%s! err_type:%d err_code:%d\n",
    ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);

    // 这里再次把上面的异常重新抛出
    rethrow;

    printf("这里将不会被执行到\n");
    }
    end_try
    }
    catch_part(7, 9)
    {
    printf("catch_part(7, 9)块,被执行到\n");
    printf("捕获到一个异常,错误原因是:%s! err_type:%d err_code:%d\n",
    ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);

    throw(2, 15, "出现某某异常");
    }
    // 再次捕获到上面的异常
    catch
    {
    printf("外层的catch块,被执行到\n");
    printf("捕获到一个异常,错误原因是:%s! err_type:%d err_code:%d\n",
    ceh_ex_info->err_msg, ceh_ex_info->err_type, ceh_ex_info->err_code);

    // 最后又抛出了一个异常,
    // 但是这个异常没有对应的catch block处理,所以系统中处理了
    throw(2, 15, "出现某某异常");
    }
    end_try
    }

      请编译运行一下,程序的运行结果如下:
      内层的catch块,被执行到
      捕获到一个异常,错误原因是:Divide by zero! err_type:-1 err_code:131
      外层的catch块,被执行到
      捕获到一个异常,错误原因是:Divide by zero! err_type:-1 err_code:131
      捕获到一个未处理的异常,错误原因是:出现某某异常! err_type:2 err_code:15
      程序终止!

顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论