On RFC 88: Serendipity while throwing a string.
[email protected] (Tony Olekshy) Mon, 28 Aug 2000 04:01:27 -0600
| Newsgroups | perl.perl6.language.errors |
|---|---|
| Organization | Avra Software Lab Inc. |
| Message-ID | <[email protected]> |
I have been working on the Perl 5 reference implementation of
RFC 88 functionality (Try.pm, which is currently available at:
http://www.avrasoft.com/perl6/try6-ref5.txt ), and I stumbled
across the following result.
If you are writing some code, and there is a "throw" subroutine
in scope, and there is a package Exception in scope and it has
a "throw" subroutine, then Perl 5 can tell the following apart
(search for the /!throw-3/ regression test in try6-ref5.txt):
throw "A Message"; # Calls the subroutine.
throw Exception; # Calls the method.
throw "A Foo Message", tag => "ABC.1234";
throw Exception "Foo", tag => "ABC.1234";
I don't know about you, but I think this is cool. Talk about
DWIM! Good old Perl.
So now, in Try.pm, If you throw a string, you get an Exception
anyway:
throw "A Message", ...;
is now the same as:
throw Exception "A Message", ...;
You can't say C<throw $@> to re-raise an exception any more,
but you can say $@->throw or use a simple bare C<throw;>!
And C<throw;> with @@ == 0 raises a simple Exception!
I'll modify RFC 88 to change the throw syntax from:
<throw> := throw <E> <message> <options> ;
<E> := <class> | <object>
to:
<throw> := throw <class> <message> <options> ;
| throw <string> <options> ;
| throw;
and make the appropriate changes to the semantics. And of course,
C<try> should accept an additional hook parameter that specifies
the class into which to instantiate string throws.
Seems obvious in retrospect; we already had <class> and <string>,
why did <E> have to be <class> | <object>? Ah well, serendipity
is like that, I suppose.
Yours, &c, Tony Olekshy