diff --git a/exon.cabal b/exon.cabal
--- a/exon.cabal
+++ b/exon.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           exon
-version:        1.6.0.2
+version:        1.6.1.0
 synopsis:       Customizable quasiquote interpolation
 description:    See https://hackage.haskell.org/package/exon/docs/Exon.html
 category:       String
@@ -99,6 +99,7 @@
       Exon.Test.BasicTest
       Exon.Test.BuildTest
       Exon.Test.NewtypeTest
+      Exon.Test.ParseTest
       Exon.Test.Quote
       Exon.Test.ShowsPrecTest
       Exon.Test.SkipWsTest
diff --git a/lib/Exon/Parse.hs b/lib/Exon/Parse.hs
--- a/lib/Exon/Parse.hs
+++ b/lib/Exon/Parse.hs
@@ -10,12 +10,10 @@
   anyChar,
   char,
   choice,
+  eof,
   getState,
   lookAhead,
-  many1,
   modifyState,
-  notFollowedBy,
-  option,
   putState,
   runParser,
   satisfy,
@@ -36,10 +34,6 @@
 whitespace =
   WsSegment <$> some ws
 
-takeRestUnless :: Parser Char -> Parser String
-takeRestUnless end =
-  many1 (notFollowedBy end *> anyChar)
-
 expr :: Parser String
 expr =
   choice [try opening, try closing, anyChars]
@@ -77,26 +71,40 @@
 interpolations =
   try autoInterpolation <|> try verbatimInterpolation
 
-stopHerald :: Parser String
-stopHerald =
-  "" <$ lookAhead (try (string "##{") <|> try (string "#{"))
-
-hash :: Parser Char
-hash = char '#'
+verbatimStep :: Bool -> Parser Bool
+verbatimStep =
+  lookAhead . \case
+    True -> False <$ ws <|> basic
+    False -> basic
+    where
+      basic =
+        False <$ (try (string "##{") <|> try (string "#{"))
+        <|>
+        False <$ eof
+        <|>
+        pure True
 
-verbatimWith :: Parser Char -> Parser String
-verbatimWith end =
-  go
+verbatimWith :: Parser Bool -> Parser String
+verbatimWith step =
+  step >>= \case
+    False -> fail "Empty verbatim segment"
+    True -> go
   where
-    go = takeRestUnless end <> (stopHerald <|> option "" (string "#" <> option "" go))
+    go =
+      step >>= \case
+        False -> pure ""
+        True -> do
+          h <- anyChar
+          t <- go
+          pure (h : t)
 
 verbatim :: Parser String
 verbatim =
-  verbatimWith hash
+  verbatimWith (verbatimStep False)
 
 verbatimWs :: Parser String
 verbatimWs =
-  verbatimWith (ws <|> hash)
+  verbatimWith (verbatimStep True)
 
 text :: Parser RawSegment
 text =
@@ -116,15 +124,15 @@
 
 parser :: Parser [RawSegment]
 parser =
-  many segment
+  many segment <* eof
 
 parserWs :: Parser [RawSegment]
 parserWs =
-  many segmentWs
+  many segmentWs <* eof
 
 parseWith :: Parser [RawSegment] -> String -> Either Text [RawSegment]
 parseWith p =
-  first show . runParser p 0 ""
+  first (unwords . lines . show) . runParser p 0 ""
 
 parse :: String -> Either Text [RawSegment]
 parse =
diff --git a/lib/Exon/Quote.hs b/lib/Exon/Quote.hs
--- a/lib/Exon/Quote.hs
+++ b/lib/Exon/Quote.hs
@@ -51,6 +51,7 @@
   QOrIO m =>
   String ->
   m Exp
+reifyExp "" = exonError ("Empty interpolation" :: String)
 reifyExp s = do
   exts <- fileExtensions
   case parseExpWithExts exts s of
diff --git a/test/Exon/Test/BasicTest.hs b/test/Exon/Test/BasicTest.hs
--- a/test/Exon/Test/BasicTest.hs
+++ b/test/Exon/Test/BasicTest.hs
@@ -46,6 +46,7 @@
   "Philip J. | FRY" === [exon|Philip J.#{up lastName}|]
   ("abc" :: Text) === skipWs [exonws|a  ##{"b" :: Text} #{"c"}|]
   ("one #" :: Text) === [exon|one #|]
+  ("one ##bug} two three" :: Text) === [exon|one ##bug} two #{"three"}|]
   where
     var :: IsString a => a
     var =
diff --git a/test/Exon/Test/ParseTest.hs b/test/Exon/Test/ParseTest.hs
new file mode 100644
--- /dev/null
+++ b/test/Exon/Test/ParseTest.hs
@@ -0,0 +1,9 @@
+module Exon.Test.ParseTest where
+
+import Hedgehog (TestT, assert)
+import Exon.Parse (parse)
+
+test_parser :: TestT IO ()
+test_parser = do
+  assert (isLeft (parse "pre #{incomplete"))
+  assert (isLeft (parse "pre ##{incomplete"))
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -3,6 +3,7 @@
 import Exon.Test.BasicTest (test_basic, test_customWhitespace)
 import Exon.Test.BuildTest (test_build)
 import Exon.Test.NewtypeTest (test_newtype)
+import Exon.Test.ParseTest (test_parser)
 import Exon.Test.ShowsPrecTest (test_showsPrec)
 import Exon.Test.SkipWsTest (test_skipWs)
 import Hedgehog (TestT, property, test, withTests)
@@ -24,7 +25,8 @@
     unitTest "custom whitespace handling" test_customWhitespace,
     unitTest "concat showsPrec fragments" test_showsPrec,
     unitTest "skip whitespace quoter" test_skipWs,
-    unitTest "segment newtype conversion" test_newtype
+    unitTest "segment newtype conversion" test_newtype,
+    unitTest "parser" test_parser
   ]
 
 main :: IO ()
