Iñaki Baz Castillo
3/3/2009 9:31:00 PM
El Martes, 3 de Marzo de 2009, Brian Candler escribi=C3=B3:
> lasitha wrote:
> > On Tue, Mar 3, 2009 at 5:58 AM, I=EF=BF=BDaki Baz Castillo <ibc@aliax.n=
et> wrote:
> >> I would like to just write:
> >> =EF=BF=BDIPAddr.new(value) rescue ArgumentError puts "Invalid IP"
> >>
> >> Unfortunatelly it doesn't work when the rescue action occurs:
> >> ------------
> >> Invalid IP
> >> NoMethodError: undefined method `ArgumentError' for main:Object
> >> ------------
> >
> > The rescue statement modifier doesn't take an exception parameter.
> > You'd have to make do with:
> > IPAddr.new(value) rescue puts "Invalid IP"
>
> ... which rescues StandardError and all subclasses.
>
> However you probably wouldn't want to do this:
>
> addr =3D IPAddr.new(value) rescue puts "Invalid IP"
> do_something_with(addr)
>
> because the second line would get addr equal to nil, and further errors
> would occur. One solution is just to let the ArgumentError propagate
> upwards, because the exception message already says "invalid address":
>
> irb(main):002:0> IPAddr.new("x")
> ArgumentError: invalid address
>
> Having said that, sometimes I do like to include the offending value in
> error messages, so I can end up writing stuff like
>
> begin
> addr =3D IPAddr.new(value)
> rescue ArgumentError
> raise ArgumentError, "Invalid IP address #{value.inspect}"
> end
>
> The risk here is that if the user provides an arbitrarily long string,
> you'll get an arbitrarily long exception message too.
>
> Another option is to stick rescue clause(s) at the end of a method body,
> because you don't need a 'begin'.
>
> def foo(value)
> addr =3D IPAddr.new(value)
> do_something_with(addr)
> rescue ArgumentError
> puts "Invalid IP address"
> raise # or not, it's up to you
> end
>
> On the plus side, this prevents the nil addr being used. On the minus
> side, *any* ArgumentError in the body of foo or any of the methods it
> calls will be reported as "Invalid IP address"
Thanks for so good explanation.
=2D-=20
I=C3=B1aki Baz Castillo