Exception handler interface

#ifndef EXCEPT_H
#define EXCEPT_H
#include<setjmp.h>

#define T Except_T
typedef struct T
{
    char * reason;
} T;


typedef struct Except_Frame Except_Frame;

struct Except_Frame
{
    Except_Frame * prev;
    jmp_buf env;
    const char * file;
    int line;
    const T * exception;
};

extern Except_Frame * Except_stack;

enum {    Except_entered=0,Except_handled,Except_raised,Except_finalized    };


void Except_raise(const T *e,const char * file,int line);
#define RAISE(e) Except_raise(&(e),__FILE__,__LINE__)
#define RERAISE Except_raise(Except_frame.exception,Except_frame.file,Except_frame.line)

#define TRY do             /
{    /
    volatile int Except_flag;/
    Except_Frame  Except_frame;    /       
    Except_frame.prev = Except_stack;        /
    Except_stack = &Except_frame;            /
    Except_flag = setjmp(Except_frame.env);    /                                   
    if (Except_flag == Except_entered)        /
    {                                       
           
#define EXCEPT(e)                             /
    if (Except_flag == Except_entered)        /               
        Except_stack = Except_stack->prev;    /
    }                                        /
    else if (Except_frame.exception == &(e))/
    {                                        /
        Except_flag = Except_handled;       
       
#define ELSE                                /   
    if (Except_flag == Except_entered)        /               
        Except_stack = Except_stack->prev;    /
    }                                        /
    else                                    /
    {                                        /
        Except_flag = Except_handled;               
               
#define FINALLY                    /
    if (Except_flag == Except_entered)        /               
        Except_stack = Except_stack->prev;    /
    }                            /
    {                            /
        if (Except_flag == Except_entered )    /
            Except_flag = Except_finalized           
               

#define END_TRY                    /
    if (Except_flag == Except_entered)        /               
        Except_stack = Except_stack->prev;    /
    }                                        /
    if (Except_flag == Except_raised)        /
        RERAISE;/
}while(0)       
       

#undef T

#endif




 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值