《OOC》笔记(2)——C语言实现trycatchfinally

本篇就偷个懒吧,实在打不起精神。

 1 #ifndef _TRY_THROW_CATCH_H_
 2 #define _TRY_THROW_CATCH_H_
 3 
 4 #include <stdio.h>
 5 #include <setjmp.h>
 6 
 7 /* For the full documentation and explanation of the code below, please refer to
 8  * http://www.di.unipi.it/~nids/docs/longjump_try_trow_catch.html
 9  */
10 
11 #define TRY do{ jmp_buf ex_buf__; switch( setjmp(ex_buf__) ){ case 0: while(1){
12 #define CATCH(x) break; case x:
13 #define FINALLY break; } default:
14 #define ETRY } }while(0)
15 #define THROW(x) longjmp(ex_buf__, x)
16 
17 #endif /*!_TRY_THROW_CATCH_H_*/

此代码的出处在这里(http://www.di.unipi.it/~nids/docs/longjump_try_trow_catch.html

原文的意思,我感兴趣的有如下几点。

1. 这个try catch宏只是一个demo。实际可用的异常机制需要有运行时(Runtime)的支持。也就是说单纯的C语言是不能提供像C#、Java那样的异常捕获机制的。

2. 这个demo使用了setjmp.h里的setjmp(jmp_buf);和longjmp(jmp_buf, int);两个函数。这两个函数很特别。setjmp将当时的CPU状态存入jmp_buf,longjmp将jmp_buf中的内容恢复到CPU。

原文地址:https://www.cnblogs.com/bitzhuwei/p/OOC-2-try-catch-finally-in-c.html