Hugh Sasse wrote:
> On Thu, 3 Nov 2005, Robert Klemme wrote:
>
>> Hugh Sasse <hgs / dmu.ac.uk> wrote:
>>> On Thu, 3 Nov 2005, Robert Klemme wrote:
>>>
>>>> Hugh Sasse wrote:
>>>>> On Thu, 3 Nov 2005, Robert Klemme wrote:
>>>>>
>>>>>> Hugh Sasse wrote:
>>>>>>> I see my changes to fileutils are now in the Ruby CVS.
>>>>>>> However, even with
>>>>>>>   rescue Exception, SystemCallError => e
>>>>>>> or
>>>>>>>   rescue Exception, Errno::EACCES, Errno::EBUSY => e
>>>>>>>
>>>>>>> I still cannot trap this error.  From the call stack this part
>>>>>>> of the code is being used, so why won't the error cause ruby to
>>>>>>> go back up the callstack until it finds this rescue clause?
>>>>>>
>>>>>> Maybe there's another rescue clause that is closer to the place
>>>>>> where the exception is thrown...
>>>>>
>>>>> But unless I have completely misunderstood the point of rescue,
>>>>> even if that calls raise, the exception will still be caught by my
>>>>> enclosing rescue.
>>>>
>>>> But who guarantees that the other rescue clause actually throws
>>>> again?  If it doesn't you can't catch it.
>>>>
>>>> ....
>>>> rescue Exception => e
>>>>   puts "Catch me if you can >:-}"
>>>> end
>>>>
>>>> ;-)
>>>>
>>>
>>> Then it's already caught, and I should never see the error.
>>
>> Why not?  If it's printed in the other rescue clause you would see
>> it.  Or am I missing something here?
>
> I wouldn't see it as an error which kills my program.  It would have
> been caught, and dealt with, or caught and re-raised, in which case
> the outer block would catch it.

Well, there's at least the theoretical chance that this block just calls
#exit... :-)

> 1 We have established that a begin...rescue...end block
>   will rescue any errors raised inside it, provided the rescue
>   clause matches that error type.
>
> 2 We have established that if a begin ... rescue ... raise ... end
>   block re-raises an error, it can be caught by a surrounding
>   begin...rescue...end block
>
> 3 My case is that I have a
>    begin
>       part1
>    rescue Exception, SystemCallError, Errno::EACCES, Errno::EBUSY => e
>       part2
>    end
>
>   block and it is not catching a Errno::EBUSY error from part1: The
>   error crashes the program.  So:
>     If that error has been raised in part1, and not caught in part1
>       then I should be able to catch it.
>     If that error has been raised in part1, and caught in part1,
>       part2 should never come into play, and the program should
>       continue
>
> 4 How can a subclass of Exception not be caught by Exception?
> 5 Why doesn't SystemCallError catch it?
> 6 Why doesn't the Errno::%s form catch it?
>
> i.e everything between "Exception" and " =>" should be unnecessary,
> but even with those it doesn't catch the error.

This sounds really strange.  Here's what I'd do: use set_trace_func to
write out all method invocations, returns and thread ids and try to see
where it goes.  HTH

Kind regards

    robert