First of all, apologise if the question is too broad. The background goes like this: I&#39;ve implemented a server program in Haskell for my company intended to replace the previous one written in C which crashes a lot (and btw the technology of the company is exclusively C-based).  When I chose Haskell I promised my manager (arrogantly - I actually made a bet with him), &quot;it won&#39;t crash&quot;. Now it has been finished (with just a few hundred LOC), and my test shows that it is indeed very stable. But by looking at the code again I&#39;m a little worried, since I&#39;m rather new to exception handling and there&#39;re many networking-related functions in the program. I was tempted to catch (SomeException e) at the very top-level of the program and try to recursively call main to restart the server in case of any exception being thrown, but I highly doubt that is the correct and idiomatic way. There are also a number of long-running threads launched from the main thread, and exceptions thrown from these threads can&#39;t be caught by the top-level `catch&#39; in the main thread. My main function looks like this:<div>

<br></div><div><div><font face="courier new, monospace">main :: IO ()</font></div><div><font face="courier new, monospace">main = withSocketsDo $ do</font></div><div><font face="courier new, monospace">    sCameraU &lt;- socketNewPassive False 6000</font></div>

<div><font face="courier new, monospace">    sStunU   &lt;- socketNewPassive False 3478</font></div><div><font face="courier new, monospace">    sCmdT    &lt;- socketNewPassive True  7000</font></div><div><font face="courier new, monospace">    mvarCam  &lt;- newMVar M.empty</font></div>

<div><font face="courier new, monospace">    mvarLog  &lt;- newMVar []</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    forkIO $ regCamera sCameraU mvarCam mvarLog</font></div>

<div><font face="courier new, monospace">    forkIO $ updCamera mvarCam mvarLog</font></div><div><font face="courier new, monospace">    forkIO $ stun sCameraU sStunU mvarCam mvarLog</font></div><div><font face="courier new, monospace"><br>

</font></div><div><font face="courier new, monospace">    listen sCmdT 128</font></div><div><font face="courier new, monospace">    processCmd sCmdT mvarCam mvarLog</font></div><div><br></div><div><font face="courier new, monospace">    sClose sCameraU</font></div>

<div><font face="courier new, monospace">    sClose sStunU</font></div><div><font face="courier new, monospace">    sClose sCmdT</font></div><div><br></div><div>I find that I can&#39;t tell whether a function will throw any exception at all, or what exceptions will be thrown, by looking at their documentation. I can only tell if I browse the source code. So the question is, how can I determine all the exceptions that can be thrown by a given function? And what is the best way to handle situations like this, with both the long-running threads and main thread need to be restarted whenever exceptions happen.</div>

</div><div><br></div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">Regards,</span><br style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
<font color="#222222" face="arial, sans-serif">Yifan</font></div>