diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,7 @@
+0.1.0.8
+
+* add `tryExitcode`
+
 0.1.0.7
 
 * Widen version boundaries
diff --git a/exitcode.cabal b/exitcode.cabal
--- a/exitcode.cabal
+++ b/exitcode.cabal
@@ -1,7 +1,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                   exitcode
-version:                0.1.0.7
+version:                0.1.0.8
 synopsis:               Monad transformer for exit codes
 description:
   <<https://system-f.gitlab.io/logo/systemf-450x450.jpg>>
diff --git a/src/Control/Exitcode.hs b/src/Control/Exitcode.hs
--- a/src/Control/Exitcode.hs
+++ b/src/Control/Exitcode.hs
@@ -37,6 +37,8 @@
 , runExitcode0
 , runExitcodeT1
 , runExitcode1
+-- * Exceptions
+, tryExitcode
 -- * Optics
 , exitCode
 , _ExitcodeInt
@@ -47,9 +49,11 @@
 , _Exitcode1
 ) where
 
+
 import Control.Applicative
     ( Applicative((<*>), pure, liftA2) )
 import Control.Category ( Category((.)) )
+import Control.Exception
 import Control.Lens
     ( preview,
       view,
@@ -67,6 +71,7 @@
 import Control.Monad ( join, Monad(return, (>>=)) )
 import Control.Monad.Cont.Class ( MonadCont(..) )
 import Control.Monad.Error.Class ( MonadError(..) )
+import Control.Monad.Except ( ExceptT(..) )
 import Control.Monad.IO.Class ( MonadIO(..) )
 import Control.Monad.Reader ( MonadReader(ask, local) )
 import Control.Monad.RWS.Class ( MonadRWS )
@@ -104,6 +109,7 @@
 import Data.Tuple ( uncurry )
 import GHC.Show ( Show(showsPrec) )
 import System.Exit ( ExitCode(..) )
+import System.IO
 
 -- $setup
 -- >>> import Prelude
@@ -732,6 +738,13 @@
   -> Either (a, Int) a
 runExitcode1 =
   runIdentity . runExitcodeT1
+
+tryExitcode ::
+  Exception e' =>
+  ExitcodeT IO e a
+  -> ExitcodeT (ExceptT e' IO) e (Either e' a)
+tryExitcode (ExitcodeT x) =
+  ExitcodeT (ExceptT (fmap (fmap (fmap Right)) (try x)))
 
 -- | A lens to the value associated with an exitcode.
 --
