#!perl use 5.010001; use strict; use warnings; use Carp; use Getopt::Long; # TODO: allow choosing stack trace depth # TODO: allow choosing to die inside eval our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY our $DATE = '2023-02-24'; # DATE our $DIST = 'Perl-Examples'; # DIST our $VERSION = '0.096'; # VERSION my %Opts; GetOptions( 'msgtype=s' => \$Opts{msgtype}, 'warn' => \$Opts{warn}, 'croak' => \$Opts{croak}, 'carp' => \$Opts{carp}, ); sub func1 { func2(1, [2, 3], {4=>5}, sub{}, qr/regex/i); } sub func2 { func3(); } sub func3 { func4(1, ["some", "arguments", {}]); } sub func4 { my @msgtypes = qw(ref strnonl strnl str empty); my $warn = $Opts{warn}; my $croak = $Opts{croak}; my $carp = $Opts{carp}; my $action = $warn ? "warn" : $croak ? "croak" : $carp ? "carp" : "die"; my $str = "Default $action message"; my $msgtype = $Opts{msgtype} // $msgtypes[rand @msgtypes]; if ($msgtype =~ /^(str):(.*)/) { $msgtype = $1; $str = $2; } unless (grep {$_ eq $msgtype} @msgtypes) { die "Unknown message type '$msgtype', please choose from: " . join(", ", @msgtypes) . "\n"; } if ($msgtype eq 'strnonl') { my $msg = "This is a $action message without newline ending"; if ($warn) { warn $msg } elsif ($croak) { croak $msg } elsif ($carp) { carp $msg } else { die $msg } } elsif ($msgtype eq 'strnl') { my $msg = "This is a $action message with newline ending\n"; if ($warn) { warn $msg } elsif ($croak) { croak $msg } elsif ($carp) { carp $msg } else { die $msg } } elsif ($msgtype eq 'str') { if ($warn) { warn $str } elsif ($croak) { croak $str } elsif ($carp) { carp $str } else { die $str } } elsif ($msgtype eq 'ref') { my $msg = [{}, "str", undef, [1,2,3]]; if ($warn) { warn $msg } elsif ($croak) { croak $msg } elsif ($carp) { carp $msg } else { die $msg } } elsif ($msgtype eq 'empty') { if ($warn) { warn } elsif ($croak) { croak } elsif ($carp) { carp } else { die } } } func1(); # ABSTRACT: Die/warn/croak/carp, with several options # PODNAME: perl-example-die __END__ =pod =encoding UTF-8 =head1 NAME perl-example-die - Die/warn/croak/carp, with several options =head1 VERSION This document describes version 0.096 of perl-example-die (from Perl distribution Perl-Examples), released on 2023-02-24. =head1 SYNOPSIS # random ways of die-ing % perl-example-die # choose a message string % perl-example-die --msgtype "str:foo bar" =head1 DESCRIPTION This script offers several ways of die-ing (or warning/croaking/carping). You can specify the various aspects via command-line options. What this can be used for: =over =item * Seeing what stack trace looks like For example: % PERL5OPT=-MCarp::Always perl-example-die % PERL5OPT=-d:Confess=color,dump perl-example-die --croak --msgtype ref =back =head1 OPTIONS =head2 --msgtype=S Message type. =over =item * ref Die with a message of reference (an arrayref). =item * empty die() without any message. =item * strnonl Die with a default string message without a newline-ending. =item * strnl Die with a default string message with a newline-ending. =item * str:STR Die with a string specified in the argument (STR). You can test, e.g. Unicode characters. =back If unspecified, will pick a random way. =head2 --warn Use C<warn> instead of the default C<die>. =head2 --croak Use L<Carp>'s C<croak> instead of C<die>. =head2 --carp Use L<Carp>'s C<carp> instead of C<die>. =head1 HOMEPAGE Please visit the project's homepage at L<https://metacpan.org/release/Perl-Examples>. =head1 SOURCE Source repository is at L<https://github.com/perlancar/perl-Perl-Examples>. =head1 AUTHOR perlancar <perlancar@cpan.org> =head1 CONTRIBUTING To contribute, you can send patches by email/via RT, or send pull requests on GitHub. Most of the time, you don't need to build the distribution yourself. You can simply modify the code, then test via: % prove -l If you want to build the distribution (e.g. to try to install it locally on your system), you can install L<Dist::Zilla>, L<Dist::Zilla::PluginBundle::Author::PERLANCAR>, L<Pod::Weaver::PluginBundle::Author::PERLANCAR>, and sometimes one or two other Dist::Zilla- and/or Pod::Weaver plugins. Any additional steps required beyond that are considered a bug and can be reported to me. =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2023, 2020, 2018, 2016, 2015 by perlancar <perlancar@cpan.org>. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =head1 BUGS Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perl-Examples> When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature. =cut