<div dir="ltr"><div><div><div><div><div><div><div><div>Dear Haskellers,<br><br></div>I've been working on variants of the following code:<br><br>connect_from_file :: String -> IO Connection<br>connect_from_file fi = do<br>  s <- BL.readFile fi<br>  cred <- (decode s :: Maybe Db_cred)<br>  c <- connect . reformat_cred $ cred<br>  return c<br><br></div>What
 this code intends to do is read a config from a file in JSON, 
decode the JSON, and then open a 
connection based the decoded info. This code doesn't compile for several
 reasons, but I've left it in this form because I believe it is the most
 convenient for approaching my question:<br></div><br></div>How should I handle errors here?<br><br></div>Both
 readFile (from Bytestring) and connect (from mysql.simple) throw 
exceptions when things don't go their way, and decode uses maybe. I see 
four ways of handling these errors:<br><br>0) <i>All typed errors: </i>I
 could "capture" all the exceptions in Either types and use an EitherIO 
monad or transformer to automatically abort when a Left value appears. 
Now my function looks like: String -> IO (Either MyErrorType 
Connection)<br></div>1) <i>All exceptions: </i>I could throw an exception if Nothing appears during decoding. The function looks the same: String -> IO Connection <br></div>2) <i>A mix</i>:
 I could leave the connect and readFile functions alone, but return IO 
(Nothing) if the decoding doesn't work out. Now we have: String -> IO
 (Maybe Connection)<br></div>3) Not 0)-2)<br><div><br></div><div>So what is the proper way to do things?<br><br></div><div>Many Thanks,<br></div><div>Hillary<br></div><div><br><br></div>PS For what it is worth, I have read:<br>0) <a target="_blank" href="https://www.schoolofhaskell.com/user/commercial/content/exceptions-best-practices">https://www.schoolofhaskell.<wbr>com/user/commercial/content/<wbr>exceptions-best-practices</a> . I'd love to get feedback on how to apply this article to my question if it is appropriate.<br>1) <a target="_blank" href="https://lexi-lambda.github.io/blog/2016/06/12/four-months-with-haskell/">https://lexi-lambda.github.io/<wbr>blog/2016/06/12/four-months-<wbr>with-haskell/</a>
 . From this article and others, I get the sense that there is great 
confusion in the community as to how to handle errors correctly, and 
worse yet, that different approaches are not easily compatible. </div>