c语言没有try catch的替代方案

setjmp与longjmp

后缀jmp指的就是jump,关看名字就能猜到这哥俩是干啥的了。使用他们俩就可以让程序控制流转移,进而实现对异常的处理。

异常处理的结构可以划分为以下三个阶段:

  • 准备阶段:在内核栈保存通用寄存器内容
  • 处理阶段:保存硬件出错码和异常类型号,然后向当前进程发送信号
  • 恢复阶段:恢复保存在内核栈中的各个寄存器内容,返回当前进程的断电处继续执行

过程有点类似递归,只有文字你可能看的有点云里雾里,我们结合一个小例子来看看

#include <stdio.h>
#include <setjmp.h>

static jmp_buf buf;

void second(void) {
 printf("second\n");
 // 跳回setjmp的调用处 - 使得setjmp返回值为1
 longjmp(buf, 1);
}

void first(void) {
 second();
 //这行到不了,因为second里面longjmp已经跳转回去了
 printf("first\n");
}

int main() {
 int rc;
 rc = setjmp(buf);
 if (rc==0) {
  // 进入此行前,setjmp返回0
  first();
 }
 // longjmp跳转回,setjmp返回1,因此进入此行
 else if(rc==1){
  printf("main\n");
 }

 return 0;
}
/*
the ressult as:
 second
 main
*/

现在我们再来看看两个函数的声明:

  • setjmp(env) :将程序上下文存储在env中
  • longjmp(env,status):env指代setjmp中所保存的函数执行状态变量,status则是作为setjmp的返回值

当然你也可以用switch代替上面的if else,其实try catch就相当于上面的那个函数你可以参考这个实现try catch

signal信号处理

个人觉得这个在linux下更好用,并且也提供了更多的信号量宏。

下面给出的是signal头文件中的定义

#define SIGINT   2 // interrupt
#define SIGILL   4 // illegal instruction - invalid function image
#define SIGFPE   8 // floating point exception
#define SIGSEGV   11 // segment violation
#define SIGTERM   15 // Software termination signal from kill
#define SIGBREAK  21 // Ctrl-Break sequence
#define SIGABRT   22 // abnormal termination triggered by abort call

这里仅给出维基上的例子

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

static void catch_function(int signal) {
 puts("Interactive attention signal caught.");
}

int main(void) {
 if (signal(SIGINT, catch_function) == SIG_ERR) {
  fputs("An error occurred while setting a signal handler.\n", stderr);
  return EXIT_FAILURE;
 }
 puts("Raising the interactive attention signal.");
 if (raise(SIGINT) != 0) {
  fputs("Error raising the signal.\n", stderr);
  return EXIT_FAILURE;
 }
 puts("Exiting.");
 return 0;
}

总结

到此这篇关于c语言没有try catch的替代方案的文章就介绍到这了,更多相关c语言try catch内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++编程异常处理中try和throw以及catch语句的用法

    若要在 C++ 中实现异常处理,你可以使用 try.throw 和 catch 表达式. 首先,使用 try 块将可能引发异常的一个或多个语句封闭起来. throw 表达式发出信号,异常条件(通常是错误)已在 try 块中发生.你可以使用任何类型的对象作为 throw 表达式的操作数.该对象一般用于传达有关错误的信息.大多数情况下,建议你使用 std::exception 类或标准库中定义的派生类之一.如果其中的类不合适,建议你从 std::exception 派生自己的异常类. 若要处理可能引

  • C++异常处理 try,catch,throw,finally的用法

    写在前面 所谓异常处理,即让一个程序运行时遇到自己无法处理的错误时抛出一个异常,希望调用者可以发现处理问题. 异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制. 也许我们已经使用过异常,但是你习惯使用异常了吗? 现在很多软件都是n*365*24小时运行,软件的健壮性至关重要. 内容导读 本文包括2个大的异常实现概念:C++的标准异常和SEH异常. C++标准异常: 也许你很高兴看到错误之后的Heap/Stack中对象被释放,可是如果没有呢? 又或者试想一下一个能解决的错误

  • c++中try catch的用法小结

    在c++中,可以直接抛出异常之后自己进行捕捉处理,如:(这样就可以在任何自己得到不想要的结果的时候进行中断,比如在进行数据库事务操作的时候,如果某一个语句返回SQL_ERROR则直接抛出异常,在catch块中进行事务回滚(回滚怎么理解?)). #include <iostream> #include <exception> using namespace std; int main () { try { throw 1; throw "error"; } cat

  • C++中try throw catch异常处理的用法示例

    前言 今天在开发过程中调用一个库函数结果库函数有throw操作,当前代码没有对throw进行捕获操作,导致进程在main 函数中捕获到异常导致进程crash.所以借此记录下c++关于try,throw,catch的用法. 程序运行时常会碰到一些异常情况,例如: 做除法的时候除数为 0: 用户输入年龄时输入了一个负数: 用 new 运算符动态分配空间时,空间不够导致无法分配: 访问数组元素时,下标越界:打开文件读取时,文件不存在. 这些异常情况,如果不能发现并加以处理,很可能会导致程序崩溃. 所谓

  • C++之try catch 异常处理入门实例

    在程序设计过程中,我们总是希望自己设计的程序是天衣无缝的,但这几乎又是不可能的.即使程序编译通过,同时也实现了所需要的功能,也并不代表程序就已经完美无缺了,因为运行程序时还可能会遇到异常,例如当我们设计一个为用户计算除法的程序时,用户很有可能会将除数输入为零,又例如当我们需要打开一个文件的时候确发现该文件已经被删除了--类似的这种情况很有很多,针对这些特殊的情况,不加以防范是不行的. 我们通常希望自己编写的程序能够在异常的情况下也能作出相应的处理,而不至于程序莫名其妙地中断或者中止运行了.在设计

  • c语言没有try catch的替代方案

    setjmp与longjmp 后缀jmp指的就是jump,关看名字就能猜到这哥俩是干啥的了.使用他们俩就可以让程序控制流转移,进而实现对异常的处理. 异常处理的结构可以划分为以下三个阶段: 准备阶段:在内核栈保存通用寄存器内容 处理阶段:保存硬件出错码和异常类型号,然后向当前进程发送信号 恢复阶段:恢复保存在内核栈中的各个寄存器内容,返回当前进程的断电处继续执行 过程有点类似递归,只有文字你可能看的有点云里雾里,我们结合一个小例子来看看 #include <stdio.h> #include

  • Golang 的defer执行规则说明

    defer介绍 defer是golang的一个特色功能,被称为"延迟调用函数".当外部函数返回后执行defer.类似于其他语言的 try- catch - finally- 中的finally,当然差别还是明显的. 在使用defer之前我们应该多了解defer的特性,这样才能避免使用上的误区. 1. 最简单的defer func test(){ defer func(){ fmt.Println("defer") }() //todo //... return //

  • 浅析golang开发Error的使用详解

    Error是Go语言开发中最基础也是最重要的部分,跟其他语言的try catch的作用基本一致,想想在PHP JAVA开发中,try catch 不会使用,或者使用不灵活,就无法感知到程序运行中出现了什么错误,是特别可怕的一件事. Error 基础 Golang中 error类型就是一个最基本interface,定义了一个Error()的方法 type error interface { Error() string } 平常使用最多的是这样的 errors.New("error")

  • GoLang函数与面向接口编程全面分析讲解

    目录 一.函数 1. 函数的基本形式 2. 递归函数 3. 匿名函数 4. 闭包 5. 延迟调用defer 6. 异常处理 二.面向接口编程 1. 接口的基本概念 2. 接口的使用 3. 接口的赋值 4. 接口嵌入 5. 空接口 6. 类型断言 7. 面向接口编程 一.函数 1. 函数的基本形式 // 函数定义:a,b是形参 func add(a int, b int) { a = a + b } var x, y int = 3, 6 add(x, y) // 函数调用:x,y是实参 形参是函

  • 详解React-Native全球化多语言切换工具库react-native-i18n

    开篇啰嗦–阶段感悟 最近2 -3个月基本都因为一些私事没怎么系统的工作和学习,途中看了几天Kotlin的东西写了些demo并且整了个小项目,但是整体状态不是很好,这些天看到些95后码农的强势细思极恐. 现在大多数醒来就已经是中午,起得早去一下健身房,起的晚就家里宅一天.公司有事或者有其他家事就去协调/沟通/处理下,整个人感觉都提前进入养老状态(当然这个锅有一半是沉迷王者荣耀不可自拔,不太好) 最近项目上基本没啥事情了,然后让手下的小伙伴们对之前做的一些内容进行二次封装,然后他们引用了一个第三方国

  • Go语言中的延迟函数defer示例详解

    前言 大家都知道go语言的defer功能很强大,对于资源管理非常方便,但是如果没用好,也会有陷阱哦.Go 语言中延迟函数 defer 充当着 try...catch 的重任,使用起来也非常简便,然而在实际应用中,很多 gopher 并没有真正搞明白 defer.return.返回值.panic 之间的执行顺序,从而掉进坑中,今天我们就来揭开它的神秘面纱!话不多说了,来一起看看详细的介绍吧. 先来运行下面两段代码: A. 匿名返回值的情况 package main import ( "fmt&qu

  • GO语言实现的http抓包分析工具pproxy介绍

    引言 web 开发和 API 开发中难免要详细分析 http 请求和响应信息.web 开发的话,浏览器提供了便利的工具,比如 chrome 和 IE 都带了 develop tool,而 firefox 更是有十分强大的 firebug,可以让 http 请求的所有秘密一览无遗.目前是 app 大流行的时代,想要观察 app 中得 http 请求的秘密,浏览器的工具和插件都无能为力,有不少本地化的软件可以很好的解决这个问题,Windows 平台下有大名鼎鼎的 Fiddler 和 HttpWatc

  • 无线标记语言(WML)基础之WMLScript 基础第1/2页

    WML Script是属于无限应用协议WAP应用层的一部分,使用它可以向WML卡片组和卡片中添加客户端的处理逻辑,目前最新的版本是1.1版.WML Script1.1是在欧洲计算机制造商协议会制定的ECMAScript脚本语言的基础上,经过修改和优化而指定的.它能够更好的支持诸如移动电话类的乍带宽通信设备,在WML编程中使用WML Script可以有效的增强客户端应用的灵活性,而且,我们也可以把WML Script作为一个工具使用,开发出功能强大的WAP网络应用和无限网页.本章我们将详细讲解WM

  • Go语言的变量、函数、Socks5代理服务器示例详解

    Go语言中变量的声明和JavaScript很像,使用var关键字,变量的声明.定义有好几种形式 1. 变量和常量 // 声明并初始化一个变量 var m int = 10 // 声明初始化多个变量 var i, j, k = 1, 2, 3 // 多个变量的声明(注意小括号的使用) var( no int name string ) // 声明时不指明类型,通过初始化值来推导 var b = true // bool型 // := 隐含声明变量并赋值 str := "mimvp.com"

  • SQL Server 2005 中使用 Try Catch 处理异常

    TRY...CATCH是Sql Server 2005/2008令人印象深刻的新特性.提高了开发人员异常处理能力.没有理由不尝试一下Try.. Catch功能. * TRY 块 - 包含可能产生异常的代码或脚本 * CATCH 块 - 如果TRY块出现异常,代码处理流将被路由到CATCH块.在这里你可以处理异常,记录日志等. Sql Server中的Try Catch和C#,JAVA等语言的处理方式一脉相承.这种一致性才是最大的创新之处. 一.SQL SERVER 2000中异常处理 CREAT

随机推荐