Hi,

At Wed, 6 Feb 2008 15:33:04 +0900,
Jeremy Thurgood wrote in [ruby-core:15370]:
> >> Would it be possible to change the superclass of Timeout::Error to  
> >> something in StandardError?
> > 
> > No.  The exception would be rescued inappropriately then.
> 
> At the moment it's being /not/ rescued inappropriately. Why should a 
> timeout exception (from within the standard libraries!) evade a naked 
> "rescue"? The current situation requires me to figure out everythign 
> that can possibly time out and add special-case error handling for it. 
> Worse than this, irb doesn't catch Timeout::Error and thus kills my 
> session (which typically has a bunch of state in it) whenever the http 
> server I'm talking to takes a while to respond.

Because Timeout::Error has changed since 1.8 but irb hasn't
follow it.


Index: lib/irb.rb =================================================================== --- lib/irb.rb (revision 15377) +++ lib/irb.rb (working copy) @@ -150,8 +150,13 @@ module IRB @context.evaluate(line, line_no) output_value if @context.echo? - rescue StandardError, ScriptError, Abort - $! = RuntimeError.new("unknown exception raised") unless $! - print $!.class, ": ", $!, "\n" - if $@[0] =~ /irb(2)?(\/.*|-.*|\.rb)?:/ && $!.class.to_s !~ /^IRB/ + exc = nil + rescue Interrupt => exc + rescue SystemExit, SignalException + raise + rescue Exception => exc + end + if exc + print exc.class, ": ", exc, "\n" + if exc.backtrace[0] =~ /irb(2)?(\/.*|-.*|\.rb)?:/ && exc.class.to_s !~ /^IRB/ irb_bug = true else @@ -162,5 +167,5 @@ module IRB lasts = [] levels = 0 - for m in $@ + for m in exc.backtrace m = @context.workspace.filter_backtrace(m) unless irb_bug if m @@ -184,6 +189,5 @@ module IRB end if $SAFE > 2 - warn "Error: irb does not work for $SAFE level higher than 2" - exit 1 + abort "Error: irb does not work for $SAFE level higher than 2" end end
-- Nobu Nakada