-#include <setjmp.h>
-#define try if(!(_exception_type=setjmp(_exception_env)))
-#define fail(E) longjmp(_exception_env, (E))
-#define else_switch_exceptions else switch(_exception_type)
-#define else_catch_exception(E) else if (_exception_type==(E))
-static jmp_buf _exception_env;
-static int _exception_type;
+#define FAILED_TO_FAIL -273
+#define SYSTEM_FAILURE -1
+#define LOCAL_FAILURE 13
+#define LIBRARY_FAILURE 23
+#define EVIL_FAILURE 666
+#define try _NEW(E,0) if(!(_E=setjmp(_EENV)))
+#define fail(E) longjmp(_EENV,((E)>0?(E):FAILED_TO_FAIL))
+#define pass_failure (_Eatom->__next?longjmp((pop(_Eatom,_Estack),_EENV),_E):_SYSFAIL(FAILED_TO_FAIL))
+#define else_switch_failures else switch(_E)
+#define else_catch(E) else if (_E==(E))