It's pretty non-trivial; especially if you start considering thread safety issues.
In what sense? Each thread needs its own cleanup stack, but other than that, I don't think there are any thread safety issues that you wouldn't also encounter in C++. Generally, exception handlers should not touch data which is shared between threads.
Code:
//try
//{
if (a) do { f( b); } while(1);
else do { f(!b); } while(1);
//}