[Haskell-cafe] Printing of asynchronous exceptions to stderr
Simon Marlow
marlowsd at gmail.com
Thu Nov 11 06:14:35 EST 2010
On 10/11/2010 17:52, Mitar wrote:
> Hi!
>
> On Wed, Nov 10, 2010 at 4:16 PM, Simon Marlow<marlowsd at gmail.com> wrote:
>> 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
> )
Oh, good point! I must have tested it with 7.0. So this is indeed
something that is fixed by the new async exceptions API: finally itself
doesn't raise async exceptions inside a mask.
To fix this with GHC 6.12.3 you'd have to avoid finally and do it manually:
let run = do
r <- (unblock doSomething `catches` [
Handler (\(_ :: MyTerminateException) -> return ()),
Handler (\(e :: SomeException) -> putStrLn $
"Exception: " ++ show e)
]) `onException` sequel
sequel
where sequel = putMVar terminated ()
Now *that* works - I tested it with 6.12.3 this time.
Cheers,
Simon
> 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
More information about the Haskell-Cafe
mailing list