第63课 C语言异常处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第63课 C语言异常处理相关的知识,希望对你有一定的参考价值。

1. 异常的概念

(1)程序在运行过程中可能产生异常

(2)异常(Exception)与Bug的区别

  ①异常是程序运行时可预料的执行分支

  ②Bug是程序是的错误,是不被预期的运行方式

2. 异常和Bug的对比

(1)异常:如运行时产生除0的情况、需要打开的外部文件不存在、数组访问时越界

(2)Bug:如使用野指针堆数组使用结束后未释放选择排序无法处理长度为0的数组

3. C语言经典处理方式:if-else

(1)示例程序

void func(…)
{
    if(判断是否产生异常)
    {
        正常情况代码逻辑
    }
    else
   {
        异常情况代码逻辑
    }
}

【编程实验】除法操作异常处理

 

(2)缺陷

  ①divide函数有3个参数,难以理解其用途

  ②divide函数调用后必须判断valid代表的结:true表示结果正常,false表示出现异常

4. C语言异常处理的优化方式

(1)通过setjmp()longjmp()进行优化

  ①包含头文件#include <setjmp.h>或<csetjmp>

  ②int setjmp(jmp_buf env):将当前上下文保存在jum_buf结构体中,以供以后longjmp()恢复状态信息时使用。如果是直接调用setjmp(),那么返回值为0;如果是由于调用longjmp()而调用setjmp(),那么返回值非0。setjmp()只能在某些特定情况下调用,如在if语句、 switch语句及循环语句的条件测试部分以及一些简单的关系表达式中。

  ③void longjmp(jmp_buf env, int val):用于恢复由最近一次调用setjmp()时保存到env的状态信息。当它执行完时,程序执行流会跳转到setjmp()那行,并根据重新执行setjmp(),但此时的setjmp()得到的返回值是val

【编程实验】除法操作异常处理优化

 

(2)缺陷

  ①引入setjmp()和longjmp()必然涉及到使用全局变量

  ②暴力跳转导致代码可读性降低

  ③本质还是if-else异常处理方式

5. C语言异常处理存在的通病

(1)会使程序逻辑中混入大量的处理异常的代码

(2)正常逻辑和异常处理代码混合在一起,导致代码迅速膨胀,难以维护。

【实例分析】异常处理代码分析

 

6. 小结

(1)程序中不可避免的会发生异常

(2)异常是在开发阶段就可以预见的运行时问题

(3)C语言中通过经典的if-else

(4)C++中存在更好的异常处理方式

以上是关于第63课 C语言异常处理的主要内容,如果未能解决你的问题,请参考以下文章

C++--第25课 - 异常处理 - 上

第3课 - 异常类构建

C语言每日一练——第63天:狼追兔子问题

第08课:服务异常处理

第25课:间接传递

第33课 main函数与命令行参数