except.h
资源名称:c.rar [点击查看]
上传用户:shmaik
上传日期:2014-06-01
资源大小:45093k
文件大小:2k
源码类别:

VC书籍

开发平台:

C/C++

  1. /* $Id: H:/drh/idioms/book/RCS/except.doc,v 1.10 1997/02/21 19:43:55 drh Exp $ */
  2. #ifndef EXCEPT_INCLUDED
  3. #define EXCEPT_INCLUDED
  4. #include <setjmp.h>
  5. #define T Except_T
  6. typedef struct T {
  7. char *reason;
  8. } T;
  9. typedef struct Except_Frame Except_Frame;
  10. struct Except_Frame {
  11. Except_Frame *prev;
  12. jmp_buf env;
  13. const char *file;
  14. int line;
  15. const T *exception;
  16. };
  17. enum { Except_entered=0, Except_raised,
  18.        Except_handled,   Except_finalized };
  19. #ifdef WIN32
  20. __declspec(thread)
  21. #endif
  22. extern Except_Frame *Except_stack;
  23. extern const Except_T Assert_Failed;
  24. void Except_raise(const T *e, const char *file,int line);
  25. #define RAISE(e) Except_raise(&(e), __FILE__, __LINE__)
  26. #define RERAISE Except_raise(Except_frame.exception, 
  27. Except_frame.file, Except_frame.line)
  28. #define RETURN switch (Except_stack = Except_stack->prev,0) default: return
  29. #define TRY do { 
  30. volatile int Except_flag; 
  31. Except_Frame Except_frame; 
  32. Except_frame.prev = Except_stack; 
  33. Except_stack = &Except_frame;  
  34. Except_flag = setjmp(Except_frame.env); 
  35. if (Except_flag == Except_entered) {
  36. #define EXCEPT(e) 
  37. if (Except_flag == Except_entered) Except_stack = Except_stack->prev; 
  38. } else if (Except_frame.exception == &(e)) { 
  39. Except_flag = Except_handled;
  40. #define ELSE 
  41. if (Except_flag == Except_entered) Except_stack = Except_stack->prev; 
  42. } else { 
  43. Except_flag = Except_handled;
  44. #define FINALLY 
  45. if (Except_flag == Except_entered) Except_stack = Except_stack->prev; 
  46. } { 
  47. if (Except_flag == Except_entered) 
  48. Except_flag = Except_finalized;
  49. #define END_TRY 
  50. if (Except_flag == Except_entered) Except_stack = Except_stack->prev; 
  51. } if (Except_flag == Except_raised) RERAISE; 
  52. } while (0)
  53. #undef T
  54. #endif