c标准异常处理-全面了解setjmp与longjmp的使用[参照].pdfVIP

  • 6
  • 0
  • 约6.35千字
  • 约 9页
  • 2021-10-13 发布于福建
  • 举报

c标准异常处理-全面了解setjmp与longjmp的使用[参照].pdf

将对 setjmp 与 longjmp 的具体使用方法和适用的场合,进行一个非常全面的阐 述。 另外请特别注意, setjmp 函数与 longjmp 函数总是组合起来使用,它们是紧密 相关的一对操作, 只有将它们结合起来使用, 才能达到程序控制流有效转移的目 的,才能按照程序员的预先设计的意图, 去实现对程序中可能出现的异常进行集 中处理。 与 goto 语句的作用类似,它能实现本地的跳转 这种情况容易理解,不过还是列举出一个示例程序吧!如下: void main( void ) { int jmpret; jmpret = setjmp( mark ); if( jmpret == 0 ) { // 其它代码的执行 // 判断程序远行中,是否出现错误,如果有错误,则跳转! if(1) longjmp(mark, 1); // 其它代码的执行 // 判断程序远行中,是否出现错误,如果有错误,则跳转! if(2) longjmp(mark, 2); // 其它代码的执行 // 判断程序远行中,是否出现错误,如果有错误,则跳转! if(-1) longjmp(mark, -1); // 其它代码的执行 } else { // 错误处理模块 switch (jmpret) { case 1: printf( Error 1\n); break; case 2: printf( Error 2\n); break; case 3: printf( Error 3\n); break; default : printf( Unknown Error); break; } exit(0); } return; } 上面的例程非常地简单, 其中程序中使用到了异常处理的机制, 这使得程序 的代码非常紧凑、清晰,易于理解。在程序运行过程中,当异常情况出现后,控 制流是进行了一个本地跳转 (进入到异常处理的代码模块, 是在同一个函数的内 部),这种情况其实也可以用 goto 语句来予以很好的实现,但是,显然 setjmp 与 longjmp 的方式,更为严谨一些, 也更为友善。 程序的执行流如图 17-1 所示。 setjmp 与 longjmp 相结合,实现程序的非本地的跳转 呵呵!这就是 goto 语句所不能实现的。也正因为如此,所以才说在 C语言 中,setjmp 与 longjmp 相结合的方式,它提供了真正意义上的异常处理机制。 其实上一篇文章中的那个例程,已经演示了 longjmp 函数的非本地跳转的场景。 这里为了更清晰演示本地跳转与非本地跳转, 这两者之间的区别, 我们在上面刚 才的那个例程基础上,进行很小的一点改动,代码如下: void Func1() { // 其它代码的执行 // 判断程序远行中,是否出现错误,如果有错误,则跳转! if(1) longjmp(mark, 1); } void Func2() { // 其它代码的执行 // 判断程序远行中,是否出现错误,如果有错误,则跳转! if(2) longjmp(mark, 2); } void Func3() { // 其它代码的执行 // 判断程序远行中,是否出现错误,如果有错误,则跳转! if(-1) longjmp(mark, -1); } void main( void ) { int jmpret; jmpret = setjmp( mark ); if( jmpret == 0 ) { // 其它代码的执行 // 下面的这些函数执行过程中,有可能出现异常 Func1(); Func2(); Func3(); // 其它代码的执行 } else { // 错误处理模块 switch (jmpret) { case

文档评论(0)

1亿VIP精品文档

相关文档