diff --git a/shellcheck.hs b/shellcheck.hs
index 33019c0..328760b 100644
--- a/shellcheck.hs
+++ b/shellcheck.hs
@@ -15,10 +15,12 @@
     You should have received a copy of the GNU Affero General Public License
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 -}
+import Control.Exception
 import Control.Monad
 import Data.Char
 import GHC.Exts
 import GHC.IO.Device
+import Prelude hiding (catch)
 import ShellCheck.Simple
 import System.Console.GetOpt
 import System.Directory
@@ -165,7 +167,7 @@ forCheckstyle options files = do
         putStrLn (formatFile file comments)
         return $ null comments
     report error = do
-        printErr $ show error
+        printErr $ show (error :: SomeException)
         return False
 
     severity "error" = "error"
@@ -214,12 +216,14 @@ getOption (_:rest) flag def = getOption rest flag def
 main = do
     args <- getArgs
     parsedArgs <- parseArguments args
-    do
+    code <- do
         status <- process parsedArgs
-        if status then exitSuccess else exitWith (ExitFailure 1)
-    `catch` \err -> do
-        printErr $ show err
-        exitWith $ ExitFailure 2
+        return $ if status then ExitSuccess else ExitFailure 1
+     `catch` return
+     `catch` \err -> do
+        printErr $ show (err :: SomeException)
+        return $ ExitFailure 2
+    exitWith code
 
 process Nothing = return False
 process (Just (options, files)) =