[GHC] #13348: Consider making throw and throwIO strict

GHC ghc-devs at haskell.org
Mon Feb 27 20:33:30 UTC 2017


#13348: Consider making throw and throwIO strict
-------------------------------------+-------------------------------------
           Reporter:  dfeuer         |             Owner:  (none)
               Type:  feature        |            Status:  new
  request                            |
           Priority:  normal         |         Milestone:  8.4.1
          Component:  Core           |           Version:  8.1
  Libraries                          |
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  Other
  Unknown/Multiple                   |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 It's possible for code to throw an exception that itself throws an
 imprecise exception. Such an exception is tricky to catch. For example:

 {{{#!hs
 import Control.Exception

 strange = throwIO (undefined :: SomeException) `catch` \ex ->
   case () of
     _ | Just _ <- (fromException ex :: Maybe IOError) -> print "IOError"
       | otherwise -> print "Something else"
 }}}

 You might think that this would catch the exception and print "Something
 else", but in fact it does not. If others think this is as surprising as I
 do, perhaps we should make `throwIO` and `throw` strict, so an exception
 will never itself be bottom. Using

 {{{#!hs
 throwIO' !e = throwIO e
 }}}

 in the code above instead of `throwIO` allows the exception to be caught.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13348>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list