脱出
setjmp() とか使うとプログラムが読みづらくなりますよーというお話。(嘘*1)
#include <stdlib.h> #include <stdio.h> #include <setjmp.h> struct _env_stack { jmp_buf env; struct _env_stack *next; } *_env_stack; struct _env_stack *_push_env() { struct _env_stack *e = malloc(sizeof(*e)); e->next = _env_stack, _env_stack = e; return e; } int _pop_env() { _env_stack = _env_stack->next; return 1; } void *_exc; #define try if (!(_exc = (void *)setjmp(_push_env()->env))) { #define catch(e) _pop_env(); } else if (e = _exc, _pop_env()) #define throw(e) longjmp(_env_stack->env, (int)(e)) int main() { char *message; try { try { printf("Step 1\n"); throw("Error!"); printf("Step 2\n"); } catch (message) { printf("Exception: %s\n", message); printf("Step 3\n"); throw("Hoge!"); printf("Step 4\n"); } } catch (message) { printf("Exception: %s\n", message); } return 0; }
try の中から return とかで脱出しちゃったりした日にゃもう大変な事に。
*1:本当は #define とか使うとプログラムが読みづらくなりますよーというお話です。(ぇ