This and other RFCs are available on the web at
  http://dev.perl.org/rfc/

=head1  TITLE

Merge C<$!>, C<$^E>, and C<$@>

=head1  VERSION

    Maintainer: Peter Scott <[EMAIL PROTECTED]>
    Date: 24 Aug 2000
    Version: 1
    Mailing List: [EMAIL PROTECTED]
    Number: 151

=head1  ABSTRACT

The distinction between the C<$!>, C<$^E>, and C<$@> variables is no longer 
worth trading for the benefits to be gained from merging them together.

=head1  DESCRIPTION

The C<$!> variable made excellent sense in Perl 4 as a representation of 
the Unix C RTL C<errno>.  It went right along with the tight integration 
and close mapping between Perl and sections 2 and 3 of the Unix manual.

The amount of third-party code published via CPAN made possible by the 
module features of Perl 5, and the likelihood of exception handling gaining 
increased importance in Perl 6 both serve to make the distinction between 
errors for which C<$!> is set and those it isn't, less useful.

Non-system code throws exceptions by C<die>ing and any code that handles 
those exceptions reads the reasons in the C<$@> variable.  Why have two 
classes of errors where failure reasons are passed in different variables 
when the distinction between those classes may appear irrelevant (not a 
Unix platform) or arbitrary (what is a 'system error' and why should it be 
set for a failed C<open> but not, say, for a failed C<new IO::Socket>?).

Hence this proposal is to merge all these together into a single 
out-of-band indicator of error, so that users don't have to check multiple 
variables in the case of an C<eval>.

=head1  IMPLEMENTATION

Merge all these variables into one.  Say for the sake of argument that it 
is C<$!> (for the mnemonic value of "something went bang").  When a C<die> 
happens in an C<eval> block, aren't we overwriting a potentially useful 
C<$!> by putting its output there?  No, because the most common thing 
people do with any C<$!> is C<die> with a message containing it, and then 
only bother looking at C<$@> if they trap the C<die>.

What about the additional information available through C<$^E> on some 
systems?  If RFC 88 passes, C<$@> will become a structured exception 
object; in a string context it evaluates to text; it could evaluate to an 
errno-type code in a numeric context (although this author has never seen 
any numeric use of C<$!> outside of documentation anyway), and for 
additional, OS-dependent information, it could have a standardized 
attribute named C<syserr> or whatever makes sense.

=head2 Impact on RFC 88

If the variable chosen is C<$@>, no impact.  If the variable chosen is 
C<$!>, then C<$@> needs to be changed to C<$!> and C<@@> needs to be 
changed to C<@!> in RFC 88.

=head2 C<$?>

While C<$?> is often discussed in the same breath as these other variables 
(see L<perlvar"Error Indicators">, for example), this RFC does not consider 
it part of the same solution space ("which of these things is not like the 
others?").  I see no contradiction in leaving it the way it is.

=head1  REFERENCES

L<perlvar/"Error Indicators">

RFC 88: Structured Exception Handling Mechanism (Try)

RFC 80: Exception objects and classes for builtins


Reply via email to