From: Tilman Giese Date: 2008-09-07T02:03:31+09:00 Subject: [ruby-core:18467] optparse.rb: $@[0,2] = nil Hi all, I have a question about the method OptionParser#notwice in lib/optparse.rb, line 988: def notwice(obj, prv, msg) unless !prv or prv == obj begin raise ArgumentError, "argument #{msg} given twice: #{obj}" rescue $@[0, 2] = nil raise end end obj end The line that is bugging me is '$@[0,2] = nil'. It leads to an invalid backtrace, backtraces are not supposed to contain nil. (1) Shouldn't this line rather be '$@.unshift(2)' instead? (2) The runtime behavior of 'raise' in the line thereafter seems particularly weird to me. It does not really raise anything. In fact, it just terminates the program, executing ensure clauses only. Please have a look at the following example: begin begin raise ArgumentError rescue $@[0,2] = nil raise ensure puts 'inner ensure' end puts 'after inner ensure' rescue puts 'outer rescue' ensure puts 'outer ensure' end puts 'after outer ensure' If you run it, you will get the following output: inner ensure outer ensure Nothing else (tested with current trunk). This can't be the right result, can it? Best regards, Tilman