If you ever want to have some "fun" try testing an implementation of this. Like the authors and many others, I've also gone down this road of implementing exceptions using longjmp/setjmp. Writing the code was not nearly as hard as writing tests for every permutation of ignoring, catching, rethrowing, finally'ing, and so on through multiple levels. Then the really good part: seeing how your implementation interacts with ucontext-based lightweight threads. I'll leave that one as an exercise for the reader, because I'm evil.
Unlike with real C++ exceptions, the "finally" block is not entered if a "return" is used inside the "catch" block. And, of course, in this system, exceptions can be caught only in the function from which they are thrown, unlike real C++ exceptions, which can be caught anywhere in the call stack. But the solution provided here is good, and is probably the best possible one for C.
2 comments
[ 2.4 ms ] story [ 23.4 ms ] thread