bugsnag-1.2.0.3: src/Network/Bugsnag/Exception/Context.hs
{-# LANGUAGE CPP #-}
module Network.Bugsnag.Exception.Context
( backtraceStackFrames
) where
import Prelude
import Data.Bugsnag hiding (Exception)
#if MIN_VERSION_base(4,20,0)
import Control.Exception (SomeException, someExceptionContext)
import Control.Exception.Backtrace (Backtraces, displayBacktraces)
import Control.Exception.Context (getExceptionAnnotations)
import Control.Monad (guard)
import Data.Foldable (toList)
import Data.List.NonEmpty (nonEmpty)
import qualified Data.List.NonEmpty as NE
import Network.Bugsnag.Exception.Parse (backtraceParser)
import Text.Parsec (parse)
#else
import Control.Exception (SomeException)
#endif
-- | Stack frames from an exception's attached 'Backtraces', if any
backtraceStackFrames :: SomeException -> Maybe [StackFrame]
#if MIN_VERSION_base(4,20,0)
backtraceStackFrames ex = fmap NE.last $ nonEmpty $ do
backtrace <- getExceptionAnnotations @Backtraces (someExceptionContext ex)
toList @Maybe $ do
let
frames =
either (const []) id $
parse backtraceParser "" $
displayBacktraces backtrace
guard $ not $ null frames
pure frames
#else
backtraceStackFrames = const Nothing
#endif