{-# LANGUAGE OverloadedStrings, GeneralizedNewtypeDeriving, ScopedTypeVariables #-} module Main where import Control.Applicative import Control.Monad.Error import Data.Monoid import Data.String (fromString) import Network.HTTP.Types import Network.Wai.Middleware.RequestLogger import Network.Wai import System.Random import Web.Scotty.Trans -- Define a custom exception type. data Except = Forbidden | NotFound Int | StringEx String deriving (Show, Eq) -- The type must be an instance of 'ScottyError'. -- 'ScottyError' is essentially a combination of 'Error' and 'Show'. instance ScottyError Except where stringError = StringEx showError = fromString . show -- Handler for uncaught exceptions. handleEx :: Monad m => Except -> ActionT Except m () handleEx Forbidden = do status status403 html "