rack-devel archive mirror (unofficial) https://groups.google.com/group/rack-devel
 help / color / mirror / Atom feed
* [PATCH] showexceptions: gracefully handle empty backtraces
@ 2010-10-08 20:58 Eric Wong
  2010-10-10 20:45 ` James Tucker
  0 siblings, 1 reply; 2+ messages in thread
From: Eric Wong @ 2010-10-08 20:58 UTC (permalink / raw)
  To: rack-devel

Also pushed out to the "showexceptions" branch of
  git://git.bogomips.org/rack.git

http://git.bogomips.org/cgit/rack.git/commit/?id=bfb59e0f92271f8ecb60e5b7146c1b6e656938b8

From bfb59e0f92271f8ecb60e5b7146c1b6e656938b8 Mon Sep 17 00:00:00 2001
From: Eric Wong <normalperson@yhbt.net>
Date: Fri, 8 Oct 2010 12:04:24 -0700
Subject: [PATCH] showexceptions: gracefully handle empty backtraces

Some HTTP servers (e.g. Unicorn and Rainbows!) raise certain
exceptions without a backtrace[1], so avoid triggering our own
NoMethodError exception because of this.

[1] - http://git.bogomips.org/cgit/unicorn.git/commit/?id=e4256da292f9626d7dfca60e08f65651a0a9139a
---
 lib/rack/showexceptions.rb  |    8 +++++++-
 test/spec_showexceptions.rb |   20 ++++++++++++++++++++
 2 files changed, 27 insertions(+), 1 deletions(-)

diff --git a/lib/rack/showexceptions.rb b/lib/rack/showexceptions.rb
index 697bc41..26ff923 100644
--- a/lib/rack/showexceptions.rb
+++ b/lib/rack/showexceptions.rb
@@ -195,7 +195,13 @@ TEMPLATE = <<'HTML'
   <h2><%=h exception.message %></h2>
   <table><tr>
     <th>Ruby</th>
-    <td><code><%=h frames.first.filename %></code>: in <code><%=h frames.first.function %></code>, line <%=h frames.first.lineno %></td>
+    <td>
+<% if first = frames.first %>
+      <code><%=h first.filename %></code>: in <code><%=h first.function %></code>, line <%=h frames.first.lineno %>
+<% else %>
+      unknown location
+<% end %>
+    </td>
   </tr><tr>
     <th>Web</th>
     <td><code><%=h req.request_method %> <%=h(req.host + path)%></code></td>
diff --git a/test/spec_showexceptions.rb b/test/spec_showexceptions.rb
index 82ac918..908f7b7 100644
--- a/test/spec_showexceptions.rb
+++ b/test/spec_showexceptions.rb
@@ -20,4 +20,24 @@ describe Rack::ShowExceptions do
     res.should =~ /RuntimeError/
     res.should =~ /ShowExceptions/
   end
+
+  it "handles exceptions without a backtrace" do
+    res = nil
+
+    req = Rack::MockRequest.new(
+      Rack::ShowExceptions.new(
+        lambda{|env| raise RuntimeError, "", [] }
+    ))
+
+    lambda{
+      res = req.get("/")
+    }.should.not.raise
+
+    res.should.be.a.server_error
+    res.status.should.equal 500
+
+    res.should =~ /RuntimeError/
+    res.should =~ /ShowExceptions/
+    res.should =~ /unknown location/
+  end
 end
-- 
Eric Wong

^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2010-10-10 20:45 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-10-08 20:58 [PATCH] showexceptions: gracefully handle empty backtraces Eric Wong
2010-10-10 20:45 ` James Tucker

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).