
Hi!
On Wed, Nov 10, 2010 at 4:16 PM, Simon Marlow
The right way to fix it is like this:
Optimist. ;-)
let run = unblock doSomething `catches` [ Handler (\(_ :: MyTerminateException) -> return ()), Handler (\(e :: SomeException) -> putStrLn $ "Exception: " ++ show e) ] `finally` (putMVar terminated ()) nid <- block $ forkIO run
In 6.12.3 this does not work (it does not change anything, I hope I tested it correctly) because finally is defined as: a `finally` sequel = block (do r <- unblock a `onException` sequel _ <- sequel return r ) You see that unblock there? So it still unblocks so that second exception is delivered immediately after catches handles the first exception? But I agree that your explanation for what is happening is the correct one. Better than my "hanging threads at the end". And with my throwIO approach I just override MyTerminateException with ThreadKilled. Mitar