@@ -36,6 +36,7 @@ module Control.Distributed.Process.Internal.Types
3636 , ProcessMonitorNotification(..)
3737 , NodeMonitorNotification(..)
3838 , PortMonitorNotification(..)
39+ , ProcessExitException(..)
3940 , ProcessLinkException(..)
4041 , NodeLinkException(..)
4142 , PortLinkException(..)
@@ -72,7 +73,7 @@ import System.Mem.Weak (Weak)
7273import Data.Map (Map)
7374import Data.Int (Int32)
7475import Data.Typeable (Typeable)
75−import Data.Binary (Binary(put, get), putWord8, getWord8, encode)
76+import Data.Binary (Binary(put, get), putWord8, getWord8, encode, decode)
7677import qualified Data.ByteString as BSS (ByteString, concat, copy)
7778import qualified Data.ByteString.Lazy as BSL
7879 ( ByteString
@@ -370,6 +371,23 @@ data ProcessRegistrationException =
370371 ProcessRegistrationException !String
371372 deriving (Typeable, Show)
372373
374+-- | Internal exception thrown indirectly by 'exit'
375+data ProcessExitException =
376+ ProcessExitException !ProcessId !Message
377+ deriving Typeable
378+
379+instance Exception ProcessExitException
380+instance Show ProcessExitException where
381+ show = showProcessExit
382+
383+showProcessExit :: ProcessExitException -> String
384+showProcessExit (ProcessExitException pid reason) =
385+ case messageFingerprint reason == fingerprint (undefined :: String) of
386+ True -> "origin=" ++ (show pid) ++ ",reason=" ++ decoded
387+ False -> "origin=" ++ show pid
388+ where decoded :: String
389+ !decoded = decode (messageEncoding reason)
390+
373391instance Exception ProcessLinkException
374392instance Exception NodeLinkException
375393instance Exception PortLinkException