Hi Sean. I hope my second answer in stackoverflow gets closer to what you
want.

I am still trying to think of a more idiomatic way of handling to situation.



On Fri, 3 Aug 2018, 19:29 Sean McAfee, <eef...@gmail.com> wrote:

> I posted about this subject on Stack Overflow yesterday[1], but I chose a
> poor example of something that raises an exception (dividing by zero, which
> apparently doesn't necessarily do so) on which the answers have mostly
> focused.
>
> I was looking for a way to evaluate an expression, and if the expression
> threw an exception, for a default value to be provided instead.  For
> example, in Ruby:
>
>     quotient = begin; a / b; rescue; -1; end
>
> Or in Lisp:
>
>     (setq quotient (condition-case nil (/ a b) (error -1)))
>
> Not having written much exception-related code in Perl 6, I hoped that
> this might work:
>
>     sub divide($a, $b) { die "Zero denominator" if $b == 0; $a / $b }
>     my $quotient = do { divide($a, $b); CATCH { default { -1 } } };
>
> It doesn't, though.  As far as I can tell, the value to which a CATCH
> block evaluates is ignored; the only useful things one can do in such a
> block are things with side effects.  Long story short, I eventually came up
> with this:
>
>     my $quotient = do { my $q; { $q = divide($a, $b); CATCH { default { $q
> = -1 } } }; $q };
>
> That's far more verbose than I've come to expect from Perl 6.  Is there
> some more concise way of expressing this logic?
>
> The doc page on exceptions mentions try, eg:
>
>     my $quotient = try { divide($a, $b) } // -1;
>
> That works in this specific case, but it seems insufficient in general.
> The function might validly return an undefined value, and this construction
> can't distinguish between that and an exception.  Also, it wouldn't let me
> distinguish among various exception cases.  I'd have to do something like:
>
>     class EA is Exception { }
>     class EB is Exception { }
>     sub divide($a, $b) { (EA, EB).pick.new.throw if $b == 0; $a / $b }
>
>     my $quotient = do { my $q; { $q = divide($a, $b); CATCH { when EA { $q
> = -1 }; when EB { $q = -2 } } }; $q };
>
>
> [1]
> https://stackoverflow.com/questions/51644197/returning-values-from-exception-handlers-in-perl-6/51670573
>
-- 
Simon Proctor
Cognoscite aliquid novum cotidie

Reply via email to