Categories
Posts in this category
- A shiny perl6.org site
- Creating an entry point for newcomers
- Sprixel, a 6 compiler powered by JavaScript
- Another perl6.org iteration
- Blackjack and Perl 6
- Why I commit Crud to the Perl 6 Test Suite
- Report from the Perl 6 Hackathon in Copenhagen
- Custom operators in Rakudo
- Defined Behaviour with Undefined Values
- Dissecting the "Starry obfu"
- Perl 6: Failing Softly with Unthrown Exceptions
- The first Perl 6 module on CPAN
- Google Summer of Code Mentor Recap
- Building a Huffman Tree With Rakudo
- Immutable Sigils and Context
- Is Perl 6 really Perl?
- Perl 6: Lost in Wonderland
- Lots of momentum in the Perl 6 community
- Musing and the future of feather and the Pugs repository
- Musings on Rakudo's spectest chart
- My first executable from Perl 6
- Trying to implement new operators - failed
- Let's build an object
- Perl 6 is optimized for fun
- How to get a parse tree for a Perl 6 Program
- Perl 6 in 2009
- Perl 6 ticket life cycle
- The Perl 6 Advent Calendar
- How to Plot a Segment of a Circle with SVG
- Publicity for Perl 6
- Rakudo architectural overview
- Rakudo Rocks
- Rakudo "star" announced
- Rakudo's rough edges
- Rats and other pets
- Releasing Rakudo made easy
- Set Phasers to Stun!
- Starry Perl 6 obfu
- Recent Perl 6 Developments August 2008
- Strings and Buffers
- Subroutines vs. Methods - Differences and Commonalities
- A SVG plotting adventure
- A Syntax Highlighter for Perl 6
- Test Suite Reorganization: How to move tests
- The Happiness of Design Convergence
- Perl 6 Tidings from September and October 2008
- Perl 6 Tidings for November 2008
- Perl 6 Tidings from December 2008
- Perl 6 Tidings from January 2009
- Perl 6 Tidings from February 2009
- Perl 6 Tidings from March 2009
- Perl 6 Tidings from April 2009
- Perl 6 Tidings from May 2009
- Perl 6 Tidings from May 2009 (second iteration)
- Perl 6 Tidings from June 2009
- Perl 6 Tidings from August 2009
- Perl 6 Tidings from October 2009
- Timeline for a syntax change in Perl 6
- Visualizing match trees
- We write a Perl 6 book for you
- When we reach 100% we did something wrong
- Where Rakudo Lives Now
- Why was the Perl 6 Advent Calendar such a Success?
- What you can write in Perl 6 today
- Why you don't need the Y combinator in Perl 6
Tue, 08 Dec 2009
Perl 6: Failing Softly with Unthrown Exceptions
Permanent link
Most programming languages handle failures with either of two paradigms: failing routines return special values, or they throw exceptions.
Either way has its severe problems: in languages like C it can be very
simple to forget to catch such a return value, and very tedious to propagate
them to the caller; on the other hand throwing exceptions often clutters the
code with way too many try blocks, and it's generally unfriendly
if you try to automatically parallelize expressions.
So Perl 6 offers a middle ground: soft or unthrown
exceptions. If a routine calls fail("message"), a new
Failure object is created and returned from the current
routine. That object behaves as an undefined value, which stores the message,
file and line information of the fail() location, a backtrace and so on.
When you ask such an object whether it's true or false, or defined or undefined, you'll get a correct answer, and the exception is marked as handled. However if you try to use it as an ordinary value, it turns into an (ordinary) fatal exception. So both of these work:
# Variant 1: no exception thrown my $handle = open('nonexistingfile'); if $handle { .say for $handle.lines; } else { # do something else } # Variant 2 my $handle = open('nonexistingfile'); # throws a fatal exception while calling $handle.lines .say for $handle.lines;
Now if you do some automatically parallelized operations, a single failure doesn't have to abort the whole operation, and neither is information lost
# divide @a1 by @a2 element-wise, a division by zero might occur: @a1 »/« @a2;
The API for accessing the Failure objects isn't very mature
yet, but the concept stands. See S04/Exceptions for the
gory details, as they stand today.