diff --git a/shell-conduit.cabal b/shell-conduit.cabal
--- a/shell-conduit.cabal
+++ b/shell-conduit.cabal
@@ -1,5 +1,5 @@
 name:                shell-conduit
-version:             4.0
+version:             4.1
 synopsis:            Write shell scripts with Conduit
 description:         Write shell scripts with Conduit. See "Data.Conduit.Shell" for documentation.
 license:             BSD3
diff --git a/src/Data/Conduit/Shell/Process.hs b/src/Data/Conduit/Shell/Process.hs
--- a/src/Data/Conduit/Shell/Process.hs
+++ b/src/Data/Conduit/Shell/Process.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE RankNTypes #-}
@@ -61,6 +62,21 @@
 instance Applicative Segment where
   (<*>) = ap; pure = return
 
+instance Alternative Segment where
+  this <|> that =
+    do ex <- tryS this
+       case ex of
+         Right x -> pure x
+         Left (e :: ProcessException) -> that
+  empty = throw ProcessEmpty
+
+-- | Try something in a segment.
+tryS :: Exception e => Segment r -> Segment (Either e r)
+tryS s =
+  case s of
+    SegmentConduit c -> SegmentConduit (tryC c)
+    SegmentProcess f -> SegmentProcess (\h -> try (f h))
+
 instance MonadIO Segment where
   liftIO x = SegmentProcess (const x)
 
@@ -69,9 +85,10 @@
   Handles Handle Handle Handle
 
 -- | Process running exception.
-data ProcessException =
-  ProcessException CreateProcess
-                   ExitCode
+data ProcessException
+  = ProcessException CreateProcess
+                     ExitCode
+  | ProcessEmpty
   deriving (Typeable)
 
 instance Exception ProcessException
@@ -83,7 +100,7 @@
               ShellCommand s -> "shell command " ++ show s
               RawCommand f args ->
                 "raw command: " ++
-                show (f : args)
+                unwords (f : map show args)
            ," returned a failure exit code: "
            ,case ec of
               ExitFailure i -> show i
