C语言的异常机制 setjump longjump函数

2023-10-26

与刺激的abort()和exit()相比,goto语句看起来是处理异常的更可行方案。不幸的是,goto是本地的:它只能跳到所在函数内部的标号上,而不能将控制权转移到所在程序的任意地点(当然,除非你的所有代码都在main体中)。
为了解决这个限制,C函数库提供了setjmp()和longjmp()函数,它们分别承担非局部标号和goto作用。头文件<setjmp.h>申明了这些函数及同时所需的jmp_buf数据类型
原理非常简单:
1.setjmp(j)设置“jump”点,用正确的程序上下文填充jmp_buf对象j。这个上下文包括程序存放位置、栈和框架指针,其它重要的寄存器和内存数据。当初始化完jump的上下文,setjmp()返回0值。
2. 以后调用longjmp(j,r)的效果就是一个非局部的goto或“长跳转”到由j描述的上下文处(也就是到那原来设置j的setjmp()处)。当作为长跳转的目标而被调用时,setjmp()返回r或1(如果r设为0的话)。(记住,setjmp()不能在这种情况时返回0。)

通过有两类返回值,setjmp()让你知道它正在被怎么使用。当设置j时,setjmp()如你期望地执行;但当作为长跳转的目标时,setjmp()就从外面“唤醒”它的上下文。你可以用longjmp()来终止异常,用setjmp()标记相应的异常处理程序。


#include <stdio.h>
#include <setjmp.h>
 
jmp_buf jumper;
 
int div(int a, int b) {
  if (b == 0) { // can't divide by 0
    longjmp(jumper, -3);//跳到以jumper 所在的jmp point,进行处理,-3 相当于具体的exception code.
  }
  return a / b;
}
 
int main(int argc, char *argv[]) {
  int jstatus = setjmp(jumper);//相当于java catch,如果发生 jumper 异常,那么会跳回到这个jmp point
  if (jstatus == 0) {//第一次执行的时候是正确的setjmp return 0.
    int a = atoi(argv[1]);
    int b = atoi(argv[2]);
    printf("%d/%d", a, b);
    int result = div(a, b);
    printf("=%d\n", result);
  } 
  else if (jstatus == -3)
    printf(" --> Error:divide by zero\n");
  else
    printf("Unhandled Error Case");
}




===============See my demo code 
#include "stdafx.h"
#include <setjmp.h>

jmp_buf jb;
void setExceptionHandlePoint();
int div(int a,int b)
{
   if(b==0)
       longjmp(jb,1314);
   else
       return a/b;
}
int _tmain(int argc, _TCHAR* argv[])
{
    int i=10,b=0;
    setExceptionHandlePoint();
      div(i,b);
     
    getchar();


    return 0;
}

void setExceptionHandlePoint()
{
     int statuscode=setjmp(jb); --当发生异常的时候将从这里执行而不再从setExceptionHandlePoint 开始,,,
     
     if(statuscode==1314)
     {
       printf("happen 1314 error....");
       getchar();
     }//当处理完异常后如果我们不指向到哪里,那么这时程序的执行点将是在000000,.也就是程序不知道到底这个时候要执行什么,,lua programing cookbook.pdf P296, we need a continuation function.....
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言的异常机制 setjump longjump函数 的相关文章

  • golang学习demo4-goroutine并行测试

    知识点 go语言的routine的使用 通道chan的使用 想测试一下go的routine 就写了个求大量素数的程序 分别开1 99个协程进行求解 对比结果 首先是没有开协程的 下面是开了少数几个协程的程序 可以看到在 cnt 5 的时候速
  • 网络协程编程

    一 背景 为什么需要网络协程 1 协程 纤程并不是一个新概念2 大并发 高性能对于服务端的高要求3 移动设备的快速增长加大了服务端大并发压力4 Go 语言的兴起将协程带到了一个新的高度支持协程的编程语言 1 Go 语言 非常容易支持大并发
  • [Unity] Unity的lua项目中模拟每帧运行一次的协程

    游戏中 我们经常需要把一些大量计算或一些需要持续逐帧运算的步骤交给协程处理 习惯了Monobehaviour中使用协程来完成这类操作的我们 然而 很多Unity项目在选择热更新方案的时候 基本都会选择使用slua ulua等lua解决方案
  • 次时代Java编程(一):Java里的协程

    声明 本文CSDN作者原创投稿文章 未经许可禁止任何形式的转载 作者 刘小溪 Maxleap的高级开发工程师 喜欢倒腾一些有意思的技术框架 对新的技术以及语言非常有兴趣 以前在shopex担任架构师 目前在Maxleap负责基础架构以及服务
  • lua协程

    coroution协程 定义协程函数 co coroutine create function a b end 启动协程函数和继续运行 coroutine resume co 10 20 co coroutine wrap function
  • Unity中协程(IEnumerator)的使用方法介绍

    在Unity中 一般的方法都是顺序执行的 一般的方法也都是在一帧中执行完毕的 当我们所写的方法需要耗费一定时间时 便会出现帧率下降 画面卡顿的现象 当我们调用一个方法想要让一个物体缓慢消失时 除了在Update中执行相关操作外 Unity还
  • lua 协同程序(coroutine)

    本文主要是根据菜鸟教程的lua协同程序 coroutine 优化出来的文章 对于网上的lua协同程序的文章 觉得菜鸟教程里的lua协同程序 coroutine 比较完善 但还是有一些地方没有说清楚 对于像我这样的新手学习起来 还是不能完全解
  • Unity 3D协程

    Unity3D 是单线程的 StartCoroutine 开启协程 Coroutine StartCoroutine IEnumerator routine Coroutine StartCoroutine string methodNam
  • 协程是安全的吗?

    前言 我们都知道 多个线程操作同一个变量 是有线程安全问题的 但是 如果换成是 多个协程操作同一个变量 呢 还会有安全问题吗 实验环境 Windows 11 Go 1 20 2 过程 先看一段Golang代码示例 func main cou
  • 【Kotlin】快速理解协程与挂起

    本文不介绍协程和挂起的基础用法 如需要请移步其他博客 本文主要讲解 kotlin中的协程是什么 协程的作用 挂起是什么 挂起的作用 本文全程尽量白话 使得协程和挂起理解起来更容易 小故事or小事故 之前面试的时候 有个面试官问了我一个问题
  • Kotlin协程视频教程,极简入门与解密

    Kotlin协程极简入门与解密视频教程已经发布到CSDN学院 https edu csdn net course detail 31728 Kotlin作为目前最为流行的编程语言之一 学Kotlin的同学们都被Kotlin的简洁的语法和它强
  • 22. 协程与Python中的多任务异步协程

    目录 前言 协程概念 示例代码 Python编写协程程序 要用到的库函数 尝试编写异步 尝试改进函数 尝试优化代码 在爬虫领域的应用 总结 前言 本节我们介绍一个新概念 协程 协程顾名思义 是协助执行程序的过程 我们将介绍协程的概念和其在P
  • C语言中协程(coroutine)实现

    C语言协程库实现说明 代码实现 1 当前支持的功能概览 1 1 创建任意数量协程并在协程中yield include
  • 【Unity3D】回合制游戏

    回合制游戏一直在游戏史 至少是在中国的游戏历史上扮演很重要的角色 从仙剑到梦幻 这类游戏深受玩家喜爱 那么在Unity3D中怎么实现呢 下面用一个比较简单Unity3D的一对一回合制游戏来说明这个问题 其实也不难 关键是理清各个处理关系 如
  • 进程,线程,协程总结

    进程 三种状态 就绪态 运行的条件都已经慢去 正在等在cpu执行 执行态 cpu正在执行其功能 等待态 等待某些 条件满足 例如一个程序sleep了 此时就处于等待态 生命周期 用户编写代码 代码本身是以进程运行的 启动程序 进入进程 就绪
  • Lua中的协程Coroutine

    一 协程是什么 1 线程 首先复习一下多线程 我们都知道线程 Thread 每一个线程都代表一个执行序列 当我们在程序中创建多线程的时候 看起来 同一时刻多个线程是同时执行的 不过实质上多个线程是并发的 因为只有一个CPU 所以实质上同一个
  • Unity协程和线程的区别

    先简要说下结论 协同程序 coroutine 与多线程情况下的线程比较类似 有自己的堆栈 自己的局部变量 有自己的指令指针 IP instruction pointer 但与其它协同程序共享全局变量等很多信息 协程 协同程序 同一时间只能执
  • 小白学协程笔记2-c语言实现协程-2021-2-10

    文章目录 前言 一 c语言中协程切换方式 二 使用setjmp 和 longjmp实现协程切换 1 setjmp和longjmp函数简介 2 协程实现 三 使用switch case实现协程切换 1 switch case小技巧 2 协程实
  • Golang协程与通道整理

    协程goroutine 不由OS调度 而是用户层自行释放CPU 从而在执行体之间切换 Go在底层进行协助实现 涉及系统调用的地方由Go标准库协助释放CPU 总之 不通过OS进行切换 自行切换 系统运行开支大大降低 通道channel 并发编
  • 进阶之Kotin协程原理和启动方式详细讲解(优雅使用协程)

    协程就是方法调用封装成类线程的API 方法调用当然比线程切换轻量 而封装成类线程的API后 它形似线程 可手动启动 有各种运行状态 能够协作工作 能够并发执行 前言 kotlin的协程在初学者看来是一个很神奇的东西 居然能做到用同步的代码块

随机推荐

  • git stash

    git stash git stash 可用来暂存当前正在进行的工作 比如想pull 最新代码 又不想加新commit 或者另外一种情况 为了fix 一个紧急的bug 先stash 使返回到自己上一个commit 改完bug之后再stash
  • vue-列表的渲染

    代码 div div
  • ES6--阮一峰版笔记

    ES6 一 ES6变量声明方法 二 Symbol 三 箭头函数 特点 不适用情景 注意事项 四 Promise Set weakSet Map WeakMap WeakRef Iterator与for of循环 Iterator for o
  • 学习笔记(101):R语言入门基础-axes坐标轴控制

    立即学习 https edu csdn net course play 24913 285845 utm source blogtoedu axes坐标轴控制 axes FALSE表示图形没有坐标轴 默认值为TRUE 表示有坐标轴 x 1
  • Docker安装ELK并实现JSON格式日志分析

    ELK是什么 ELK是elastic公司提供的一套完整的日志收集以及前端展示的解决方案 是三个产品的首字母缩写 分别是ElasticSearch Logstash和Kibana 其中Logstash负责对日志进行处理 如日志的过滤 日志的格
  • 湖北02-2005年第四批院校调档分数线对比表

    院校名称 科类名称 2002年 2003年 2004年 2005年 军事经济学院 理工类 398 399 文史类 409 393 海军工程大学 理工类 441 410 402 文史类 409 通信指挥学院 理工类 420 430 383 3
  • 记一次STM32全国研讨会之旅

    记一次STM32全国研讨会之旅 在上大学的时候 我就一直仰慕稚晖君 一直把他当做我的指路明灯 不料 这明灯太亮了 苦苦追寻 望尘莫及 我记得稚晖君受邀参加过STM32全球峰会 终于今年我也有幸参与了STM32全国研讨会的宣传片的录制 哈哈
  • Python 判断三位水仙花数

    判断水仙花数 介绍 水仙花数是一个三位数 它的每位数字的3次幂之和等于它本身 例如 153 1 3 5 3 3 3 知识点 1 算术运算符 幂 符号 整除 符号 取余 符号 2 if else 条件语句 3 类型转换 4 while 循环
  • STM32标准外设库中USE_STDPERIPH_DRIVER, STM32F10X_MD的含义

    在项目中使用stm32标准外设库 STM32F10x Standard Peripherals Library 的时候 我们会在项目的选项中预定义两个宏定义 USE STDPERIPH DRIVER STM32F10X MD 如下图 这两个
  • 3ds max文件导出osg或者ive格式

    osg osgEarth系列文章目录 文章目录 osg osgEarth系列文章目录 前言 参考 前言 首先下载插件osgexp Osgexp的下载地址 安装上之后 如果3ds max导出里面已经可以选择导出ive或者osg 恭喜你 如果没
  • ChatGPT在教育行业如何应用?

    ChatGPT对教育的影响引发了多轮探讨 在多知网近日举办的OpenTalk第39期 AI 2 0技术在教育领域如何开花 活动上 作为连续创业者 AI创业项目Copi创办人卢晓勇分享了关于AI2 0时代下教育领域的创业机会的思考 核心观点
  • 【多目标跟踪】 TrackFormer 耗时三天 单句翻译!!!

    多目标跟踪 TrackFormer 耗时三天 单句翻译 TrackFormer Multi Object Tracking with Transformers Abstract The challenging task of multi o
  • 小程序商城怎么运营?

    小程序商城是一种新兴的电商模式 它具有低成本 高效率 易于推广等优势 越来越多的企业和个体户商家开始使用小程序商城进行电商运营 那么关于小程序商城怎么运营呢 下面就让我们来看看小程序商城的运营方法吧 如何进行小程序商城的运营 1 确定目标用
  • MES系统实施价值主要在哪四个方面?

    经过多年的建设 MES扩大了使用范围 增强了应用效果 MES覆盖范围从最初的化工行业 扩展至现今的各大制造行业 同时 MES作为智能生产 精细管理的有力抓手 贯穿于企业生产 管理的各个环节与层面 为提高决策效率 节约生产成本 改善流程控制
  • §4 画出你的轨迹——标注轨迹及演示动画

    4 标注轨迹及演示动画 4 1 折线标注 4 1 1 创建一个简单的折线 4 1 2 连接数据库批量创建折线 4 2 轨迹演示动画 4 1 折线标注 4 1 1 创建一个简单的折线 参考百度地图官方文档 var polyline new B
  • yagmail设置定时任务

    使用定时器之前需要先安装schedule第三方库 pip install schedule 1 附注释的代码 import yagmail import schedule import time import datetime yag ya
  • java发送json post请求_java代码发送JSON格式的httpPOST请求

    package com test import java io BufferedReader import java io DataOutputStream import java io IOException import java io
  • JPA和hibernate以及SpringDataJPA

    什么是jpa JPA java persistence api 为POJO 就是我们的JavaBean 提供持久化标准规范 JavaEE规范之一 主要思想 3个 1 ORM Object Relational Mapping 映射元数据 通
  • 《啤酒厂选址》题解报告

    一 题目 http noi openjudge cn ch0113 19 https www luogu com cn problem T166959 二 思路 对于第i个点作为出发点 到第j点的时间 判断i到j的距离是否小于环岛总长度的一
  • C语言的异常机制 setjump longjump函数

    与刺激的abort 和exit 相比 goto语句看起来是处理异常的更可行方案 不幸的是 goto是本地的 它只能跳到所在函数内部的标号上 而不能将控制权转移到所在程序的任意地点 当然 除非你的所有代码都在main体中 为了解决这个限制 C