[Haskell-cafe] Teach me to cooperate with IOException
Henning Thielemann
lemming at henning-thielemann.de
Tue Apr 16 10:58:13 UTC 2024
On Tue, 16 Apr 2024, Folsk Pratima wrote:
> foreign import ccall unsafe "complex.c syscall_that_fails" c_syscall_that_fails
> :: Ptr CInt -> IO CInt
>
> sysCall :: Int -> IO ()
> sysCall i =
> allocaBytes (sizeOf (0 :: CInt)) $ \ptr -> do
> st <- c_syscall_that_fails ptr
> errno <- peekElemOff ptr 0
> case st of
> (-1) -> throwIO $ userError $ "syscall: " ++ show errno
> _ -> return ()
>
> ```
>
> Now, I do not think it is a "user error", it is a real system call
> error that might or might not be already covered by System.IO.Error. In
> my case errno is 2, it is "No such file or directory", so it is covered
> by System.IO.Error and I may just use the library. But my C code may
> call whatever!
Generally I discourage using the exceptions implicit in IO. Exceptions
must be properly handled by the function caller, the caller must know what
exceptions can occur. Thus I prefer using Exception monad transformers
like transformers:Trans.ExceptT or
explicit-exception:Trans.Exception.Synchronous.
More information about the Haskell-Cafe
mailing list