The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

Overview

Error::Pure system is replacement for usage of Perl die or Carp croak.

Main features are:

  • Structured and defined output

  • Stack trace support inside

Basic usage

Simple Perl script, which have two subroutines and there is error inside. Error output via Error::Pure is to console and with ANSI colors. Output formatter is placed in "err_bt_pretty" in Error::Pure::Output::ANSIColor.

Environment set of output formatter

 on bash
 export ERROR_PURE_TYPE=ANSIColor::AllError

 on tcsh
 setenv ERROR_PURE_TYPE ANSIColor::AllError

Alternative way is add formatter to code

 $Error::Pure::TYPE = 'ANSIColor::AllError';

Perl script

 #!/usr/bin/env perl

 use strict;
 use warnings;

 use Error::Pure qw(err);

 sub first {
         my $text = shift;

         second($text);

         return;
 }

 sub second {
         my $text = shift;

         err 'This is error',
                 'Context', $text,
         ;
 }

 first("Hello world");

Output to stderr

 ERROR: This is error
 Context: Hello world
 main  err     /home/skim/data/gitprac/lang/perl/perl/MODULES/Error-Pure/ex19.pl  19
 main  second  /home/skim/data/gitprac/lang/perl/perl/MODULES/Error-Pure/ex19.pl  11
 main  first   /home/skim/data/gitprac/lang/perl/perl/MODULES/Error-Pure/ex19.pl  24

Output is in ANSI colors, you could look to image

Basic example

Capture error

The sama example as previous with capturing of error and print all information which we have. About fetching of information look to Error::Pure::Utils.

Perl script

 #!/usr/bin/env perl

 use strict;
 use warnings;

 use Data::Printer;
 use English;
 use Error::Pure qw(err);
 use Error::Pure::Utils qw(err_get);

 sub first {
         my $text = shift;

         second($text);

         return;
 }

 sub second {
         my $text = shift;

         err 'This is error',
                 'Context', $text,
         ;
 }

 eval {
         first("Hello world");
 };
 if ($EVAL_ERROR) {
         print 'EVAL_ERROR: '.$EVAL_ERROR."\n";
         my @errors = err_get();
         p @errors;
 }

Output

 EVAL_ERROR: This is error
 
 [
     [0] {
             msg     [
                 [0] "This is error",
                 [1] "Context",
                 [2] "Hello world"
             ],
             stack   [
                 [0] {
                         args    "('This is error', 'Context', 'Hello world')",
                         class   "main",
                         line    22,
                         prog    "/home/skim/err.pl",
                         sub     "err"
                     },
                 [1] {
                         args    "('Hello world')",
                         class   "main",
                         line    14,
                         prog    "/home/skim/err.pl",
                         sub     "second"
                     },
                 [2] {
                         args    "('Hello world')",
                         class   "main",
                         line    28,
                         prog    "/home/skim/err.pl",
                         sub     "first"
                     },
                 [3] {
                         args    "",
                         class   "main",
                         line    27,
                         prog    "/home/skim/err.pl",
                         sub     "eval {...}"
                     }
             ]
         }
 ]