diff --git a/Data/Attempt.hs b/Data/Attempt.hs
--- a/Data/Attempt.hs
+++ b/Data/Attempt.hs
@@ -38,6 +38,8 @@
     , successes
     , failures
     , partitionAttempts
+      -- * Runtime exceptions
+    , attemptIO
       -- * Reexport the 'Failure' class
     , module Control.Failure
     ) where
@@ -185,3 +187,15 @@
  where
   f a (l, r) = (E.toException a:l, r)
   s a (l, r) = (l, a:r)
+
+-- | Catches runtime (ie, IO) exceptions inserts them into an 'Attempt'.
+--
+-- Like 'handle', the first argument to this function must explicitly state the
+-- type of its input.
+attemptIO :: (E.Exception eIn, E.Exception eOut)
+          => (eIn -> eOut)
+          -> IO v
+          -> IO (Attempt v)
+attemptIO f =
+      E.handle (return . Failure . f)
+    . fmap Success
diff --git a/attempt.cabal b/attempt.cabal
--- a/attempt.cabal
+++ b/attempt.cabal
@@ -1,5 +1,5 @@
 name:            attempt
-version:         0.2.1
+version:         0.2.2
 license:         BSD3
 license-file:    LICENSE
 author:          Michael Snoyman, Nicolas Pouillard
