Skip to content

Exception fails all exception predicates

Attempting to operate on a file with an invalid filename (e.g., "C:\C:\") yields an "invalid parameter" exception. This exception appears to be a kind of IOError, yet it fails all 8 exception predicates.

test :: IO x -> IO ()
test a = do
  catch (a >> return ()) examine

examine :: IOError -> IO ()
examine ioe = do
  putStrLn $ "isAlreadyExistsError___" ++ show (isAlreadyExistsError   ioe)
  putStrLn $ "isDoesNotExistError    " ++ show (isDoesNotExistError    ioe)
  putStrLn $ "isAlreadyInUseError____" ++ show (isAlreadyInUseError    ioe)
  putStrLn $ "isFullError            " ++ show (isFullError            ioe)
  putStrLn $ "isEOFError_____________" ++ show (isEOFError             ioe)
  putStrLn $ "isIllegalOperation     " ++ show (isIllegalOperation     ioe)
  putStrLn $ "isPermissionError______" ++ show (isPermissionError      ioe)
  putStrLn $ "isUserError            " ++ show (isUserError            ioe)

Now try, for example, test (openFile "C:\\C:\\" ReadMode). All 8 predicates above return False. (However, if you do, say, test (error "no"), the catch function doesn't trap it at all because it's not an IOError.)

I was under the impression this is what the "illegal operation" type was for?

Trac metadata
Trac field Value
Version 6.6.1
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component libraries/base
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information