# Only able to capture last exception

**URL:** <https://www.ruby-forum.com/t/only-able-to-capture-last-exception/167839>\
**Category:** Ruby\
**Created:** [May 13, 2009, 5:18am UTC](https://www.ruby-forum.com/t/only-able-to-capture-last-exception/167839 "2009-05-13T05:18:31Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![Jeremy\_Schneider](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/d2c977/32.png) [@Jeremy\_Schneider](https://www.ruby-forum.com/u/Jeremy_Schneider)\
**Post date:** [May 13, 2009, 5:18am UTC](https://www.ruby-forum.com/t/only-able-to-capture-last-exception/167839/1 "2009-05-13T05:18:31Z")

</div>

I am writing a script to validate some documents against an XSD. When a  
document does not validate, I want to provide all the available  
information about the reason(s) why it does not validate.

My problem is that it looks like two exceptions are raised in the  
process of validating a document, but my method for dealing with the  
exceptions only captures the last exception, and I would like to capture  
all the exceptions.

Below is my program and its output. As you can see, two error messages  
end up being sent to standard error, but the rescue part only captures  
one (the last) error message.

Is there a good way to capture all of the exceptions generated in the  
call to validate? I could play tricks like running the validation as a  
system command and then parsing the standard error, but that seems very  
clunky, and it feels like there should be a better way. I have tried  
searching with Google and reading various references about exception  
handling in Ruby, and not found the answer. Maybe I just don’t know the  
right terms to use.

Please forgive my naive Ruby code below. I’m just starting out,  
obviously. Thanks for any assistance or guidance.

jeremy@jeremy-ubu810:~/xmlplay$ cat XML\_Demo\_5.rb  
require ‘rubygems’  
require ‘xml’

def myvalidate(theXMLDoc, theXSD)  
valid = false  
begin  
theXMLDoc.validate(theXSD)  
rescue StandardError =\> e  
puts "message is: (#{e.to\_s}); caller is: " + caller.inspect  
else  
valid = true  
end  
return valid  
end

dtd = XML::Dtd.new(%{

 })

puts “Validation should fail:\n”

open(‘cookbook2.xml’, ‘w’) do |f|  
f.write %{\<?xml version="1.0"?\>

 A recipe A recipe } end

document = XML::Document.file(‘cookbook2.xml’)

if myvalidate(document,dtd)  
puts “\nThe document was valid.”  
else  
puts “\nThe document was not valid.”  
end

jeremy@jeremy-ubu810:~/xmlplay$ ruby XML\_Demo\_5.rb 2\> stderr  
Validation should fail:  
message is: (Error: No declaration for element title2 at  
cookbook2.xml:5.); caller is: [“XML\_Demo\_5.rb:36”]

The document was not valid.  
jeremy@jeremy-ubu810:~/xmlplay$ cat stderr  
Error: Element recipe content does not follow the DTD, expecting (title?  
, problem)+, got (title title2 ) at cookbook2.xml:3.  
Error: No declaration for element title2 at cookbook2.xml:5.  
jeremy@jeremy-ubu810:~/xmlplay$
