#include #include #include #include "ex.h" /* === foo.h === */ typedef enum { FOO_OK = 0, FOO_ERR_1, FOO_ERR_2, FOO_ERR_3 } foo_rc_t; #define FOO_TEXAS #ifdef FOO_TEXAS #include "ex.h" #define FOO_ERR(err) \ (ex_throw(FOO_CLASS, NULL, FOO_ERR_##err), FOO_ERR_##err) #else #define FOO_ERR(err) \ (FOO_ERR_##err) #endif #define FOO_EX2RC(e) \ ((foo_rc_t)((e)->ex_value)) #define FOO_CLASS (&foo_class) extern int foo_class; foo_rc_t foo_func(void); /* === foo.c === */ int foo_class; static int foo_sub(void) { fprintf(stderr, "mark4\n"); if (random() % 2) return FOO_OK; return FOO_ERR(1); } foo_rc_t foo_func(void) { fprintf(stderr, "mark3\n"); foo_sub(); if (random() % 2) return FOO_OK; return FOO_ERR(2); } /* === test.c === */ int main(int argc, char *argv[]) { srandom((unsigned int)time(NULL)); ex_t e; fprintf(stderr, "main-0\n"); for (;;) { fprintf(stderr, "main-1\n"); try { fprintf(stderr, "main-2\n"); foo_func(); fprintf(stderr, "main-3\n"); for (;;) { fprintf(stderr, "main-4\n"); try { fprintf(stderr, "main-5\n"); foo_func(); fprintf(stderr, "main-6\n"); } catch (e) { fprintf(stderr, "main-7\n"); fprintf(stderr, " %s@%s:%d class=0x%lx object=0x%lx value=0x%lx\n", e.ex_func, e.ex_file, e.ex_line, (long)e.ex_class, (long)e.ex_object, (long)e.ex_value); if (e.ex_class == FOO_CLASS && (foo_rc_t)(e.ex_value) == FOO_ERR_1) fprintf(stderr, " exception handling\n"); else { fprintf(stderr, " exception rethrowing\n"); ex_rethrow; } fprintf(stderr, "main-8\n"); } fprintf(stderr, "main-9\n"); } fprintf(stderr, "main-10\n"); } catch (e) { fprintf(stderr, "main-11\n"); fprintf(stderr, " %s@%s:%d class=0x%lx object=0x%lx value=0x%lx\n", e.ex_func, e.ex_file, e.ex_line, (long)e.ex_class, (long)e.ex_object, (long)e.ex_value); fprintf(stderr, "main-12\n"); } } fprintf(stderr, "main-0\n"); return 0; }