第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++中存在更好的异常处理方式

时间: 2024-08-03 15:19:10

第63课 C语言异常处理的相关文章

第一课 C语言简明教程

1序言: 1与Java.C#等高级语言相比,C语言却非常简单,学习简单,使用也简单,但是也非常重要,到目前为止基本上操作系统的内核代码超过百分之九十使用C语言完成,因此学好C语言是学好计算机这门课程的基础,特别是进入系统编程尤为明显. 今天是本人复习C语言课程的第一课,主要重新记录一下C语言的基础知识,这节课涉及到C语言的结构.变量以及类型.输入输出.条件判断以及循环知识. 2知识点: 2.1 C语言的结构 2.1.1 通常情况下C语言程序是由: 1.相关的代码注释,使用/* ··· */可注释

Go语言之Go语言 异常处理与测试

Go 语言异常处理与测试 Go 语言异常处理 Go语言没有结构化异常,使用 panic 抛出错误,recover 捕获错误. 异常的使用场景简单描述:Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理. panic: 1.内置函数 2.假如函数F中书写了panic语句,会终止其后要执行的代码,在panic所在函数F内如果存在要执行的defer函数列表,按照defer的逆序执行 3.返回函数F的调用者G,在G中,调用函数F语句之后的代码不会执行,假如

第5课 C语言指针深入1

1.客户端两种主流的接口模型: #ifndef _SOCKETCLINET_H #endif _SOCKETCLINET_H #ifdef __cplusplus //如果用了C++的编译器,用C语言的规范来引用 extern "C" { #endif //socket客户端环境初始化 int socketclient_init(void** handle); //socket客户端报文发送 int socketclient_send(void* handle, unsigned ch

C语言异常处理的方式

1.语言本身没有异常处理的原则. 一.异常的概念: 1.程序在运行过程中可能产生异常. 2.异常(Exception)与Bug的区别 @1:异常是程序运行时可预料的执行分支.是我们在程序开发时要考虑的一些特殊情况 @2:Bug是程序中的错误,是不可被预期的运行方式 二.异常(Exception)和Bug的对比 1.异常的例子: (1)运行时产生除0的情况 (2)需要打开的外部文件不存在 (3)数组访问越界 2.bug的例子: (1)使用了野指针 (2)堆数组使用结束后未释放 (3)选择排序无法处

C 语言异常处理(五十二)

我们今天来看下异常处理,在看 C++ 的异常处理之前,先来看看 C 语言中的异常处理.那么什么是异常呢?在程序运行过程中可能会产生异常,异常(Exception)与 Bug 的区别是:异常是程序运行时可预料的执行分支,而 Bug 是程序中的错误,是不被预期的运行方式. 下来我们来看看异常和 Bug 的对比:a> 异常比如运行时产生除 0 的情况,需要打开的外部文件不存在,数组访问时越界:b> Bug 是使用野指针,堆数组使用结束后未释放,选择排序无法处理长度为 0 的数组.在 C 语言中的经典

c语言异常处理机制

异常处理机制:setjmp()函数与longjmp()函数 C标准库提供两个特殊的函数:setjmp() 及 longjmp(),这两个函数是结构化异常的基础,正是利用这两个函数的特性来实现异常. 所以,异常的处理过程可以描述为这样: 首先设置一个跳转点(setjmp() 函数可以实现这一功能),然后在其后的代码中任意地方调用 longjmp() 跳转回这个跳转点上,以此来实现当发生异常时,转到处理异常的程序上,在其后的介绍中将介绍如何实现. setjmp() 为跳转返回保存现场并为异常提供处理

Asp.Net Web API 2第七课——Web API异常处理

前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文主要来讲解Asp.Net Web API中错误和异常的处理,包括以下几点: 1.HttpResponseException——HTTP响应异常 2.Exception Filters——异常过滤器 3.Registering Exception Filters——注册异常过滤器 4.HttpError——HTTP错误 H

第30课 C语言中的字符串

1. 字符串的概念 (1)字符串是有序字符的集合 (2)字符串是程序中的基本元素之一 (3)C语言中没有字符串的概念,而是通过特殊的字符数组模拟字符串,是以'\0'结尾的字符数组. 2. 字符数组与字符串 (1)在C语言中,字双引号引用的单个或多个字符是一种特殊的字面量,被存储于程序的全局只读存储区,在本质上为字符数组,编译器自动在结尾加上'\0'字符. [实例分析]字符数组与字符串 #include <stdio.h> int main(){ char ca[] = {'H','e','l'

Struts2学习第八课 声明式异常处理

异常处理:exception-mapping元素 exception-mapping元素:配置当前的action的声明式异常处理 exception-mapping元素有两个属性: --exception:指定需要铺货的异常类型 --result:指定一个响应结果,该结果将在捕获到指定异常时被执行,既可以来自当前action的声明也可以来自global-results声明. 可以通过global-exception-mappings元素为应用程序提供一个全局性的异常补货映射,但是在global-