diff --git a/simple.cabal b/simple.cabal
--- a/simple.cabal
+++ b/simple.cabal
@@ -1,5 +1,5 @@
 name:                simple
-version:             0.10.0.1
+version:             0.10.0.2
 synopsis: A minimalist web framework for the WAI server interface
 description:
 
@@ -85,6 +85,7 @@
     Web.Simple,
     Web.Simple.Auth,
     Web.Simple.Controller,
+    Web.Simple.Controller.Exception,
     Web.Simple.Controller.Trans,
     Web.Simple.Responses,
     Web.Simple.Static,
diff --git a/src/Web/Simple.hs b/src/Web/Simple.hs
--- a/src/Web/Simple.hs
+++ b/src/Web/Simple.hs
@@ -16,6 +16,7 @@
 module Web.Simple (
     module Web.Simple.Responses
   , module Web.Simple.Controller
+  , module Web.Simple.Controller.Exception
   , module Web.Simple.Static
   , module Network.Wai
   -- * Overview
@@ -34,6 +35,7 @@
 import Network.Wai
 import Web.Simple.Responses
 import Web.Simple.Controller
+import Web.Simple.Controller.Exception
 import Web.Simple.Static
 
 {- $Overview
diff --git a/src/Web/Simple/Controller/Exception.hs b/src/Web/Simple/Controller/Exception.hs
new file mode 100644
--- /dev/null
+++ b/src/Web/Simple/Controller/Exception.hs
@@ -0,0 +1,27 @@
+module Web.Simple.Controller.Exception where
+
+import qualified Control.Exception as E
+import           Control.Monad.Trans.Control
+import           Web.Simple.Controller
+
+onException :: Controller s a -> Controller s b -> Controller s a
+onException act handler = control $ \runInM -> do
+  runInM act `E.onException` runInM handler
+
+finally :: Controller s a -> Controller s b -> Controller s a
+finally act handler = do
+  res <- (act `onException` handler)
+  handler
+  return res
+
+bracket :: Controller s a -> (a -> Controller s b)
+        -> (a -> Controller s c) -> Controller s c
+bracket aquire release act = do
+  a <- aquire
+  act a `finally` release a
+
+handle :: E.Exception e => (e -> Controller s a) -> Controller s a
+       -> Controller s a
+handle handler act = control $ \runInM -> do
+  E.handle (runInM . handler) $ runInM act
+
