]>
Dogcows Code - chaz/p5-File-KDBX/blob - lib/File/KDBX/Error.pm
7181c7776b91c5cb8046253949f099bca540ee5d
1 package File
::KDBX
::Error
;
2 # ABSTRACT: Represents something bad that happened
8 use Exporter
qw(import);
9 use Scalar
::Util
qw(blessed looks_like_number);
10 use namespace
::clean
-except
=> 'import';
12 our $VERSION = '0.903'; # VERSION
14 our @EXPORT = qw(alert error throw);
16 my $WARNINGS_CATEGORY;
18 $WARNINGS_CATEGORY = 'File::KDBX';
19 if (warnings-
>can('register_categories')) {
20 warnings
::register_categories
($WARNINGS_CATEGORY);
23 eval qq{package $WARNINGS_CATEGORY; use warnings::register; 1}; ## no critic ProhibitStringyEval
26 my $debug = $ENV{DEBUG
};
27 $debug = looks_like_number
($debug) ? (0 + $debug) : ($debug ? 1 : 0);
28 *_DEBUG
= $debug == 1 ? sub() { 1 } :
29 $debug == 2 ? sub() { 2 } :
30 $debug == 3 ? sub() { 3 } :
31 $debug == 4 ? sub() { 4 } : sub() { 0 };
34 use overload
'""' => 'to_string', cmp => '_cmp';
39 my %args = @_ % 2 == 0 ? @_ : (_error
=> shift, @_);
41 my $error = delete $args{_error
};
43 $e =~ s/ at \H+ line \d+.*//g;
47 error
=> $e // 'Something happened',
52 local $Carp::CarpInternal
{''.__PACKAGE__
} = 1;
53 my $mess = $error =~ /at \H+ line \d+/ ? $error : Carp
::longmess
($error);
54 [map { /^\h*(.*?)\.?$/ ? $1 : $_ } split(/\n/, $mess)];
63 my $class = @_ && $_[0] eq __PACKAGE__
? shift : undef;
64 my $self = (blessed
($_[0]) && $_[0]->isa('File::KDBX::Error'))
68 : __PACKAGE__-
>new(@_);
76 my $details = $self->{details
} //= {};
77 @$details{keys %args} = values %args;
83 sub errno
{ $_[0]->{errno
} }
84 sub previous
{ $_[0]->{previous
} }
85 sub trace
{ $_[0]->{trace
} // [] }
86 sub type
{ $_[0]->details->{type
} // '' }
89 sub _cmp
{ "$_[0]" cmp "$_[1]" }
93 my $msg = "$self->{trace}[0]";
94 $msg .= '.' if $msg !~ /[\.\!\?]$/;
97 local $Data::Dumper
::Indent
= 1;
98 local $Data::Dumper
::Quotekeys
= 0;
99 local $Data::Dumper
::Sortkeys
= 1;
100 local $Data::Dumper
::Terse
= 1;
101 local $Data::Dumper
::Trailingcomma
= 1;
102 local $Data::Dumper
::Useqq
= 1;
103 $msg .= "\n" . Data
::Dumper
::Dumper
$self;
105 $msg .= "\n" if $msg !~ /\n$/;
111 my $self = error
(@_);
117 return if !($File::KDBX
::WARNINGS
// 1);
119 my $self = error
(@_);
121 # Use die and warn directly instead of warnings::warnif because the latter only provides the stringified
122 # error to the warning signal handler (perl 5.34). Maybe that's a warnings.pm bug?
124 if (my $fatal = warnings-
>can('fatal_enabled_at_level')) {
125 my $blame = _find_blame_frame
();
126 die $self if $fatal->($WARNINGS_CATEGORY, $blame);
129 if (my $enabled = warnings-
>can('enabled_at_level')) {
130 my $blame = _find_blame_frame
();
131 warn $self if $enabled->($WARNINGS_CATEGORY, $blame);
133 elsif ($enabled = warnings-
>can('enabled')) {
134 warn $self if $enabled->($WARNINGS_CATEGORY);
143 sub alert
{ goto &warn }
145 sub _find_blame_frame
{
148 my ($package) = caller($frame);
150 return $frame - 1 if $package !~ /^\Q$WARNINGS_CATEGORY\E/;
166 File::KDBX::Error - Represents something bad that happened
176 \%details = $error->details;
178 Get the error details.
182 Get the value of C<errno> when the exception was created.
186 Get the value of C<$@> (i.e. latest exception) at the time the exception was created.
190 Get a stack trace indicating where in the code the exception was created.
194 Get the exception type, if any.
200 $error = File::KDBX::Error->new($message, %details);
202 Construct a new error.
206 $error = error($error);
207 $error = error($message, %details);
208 $error = File::KDBX::Error->error($error);
209 $error = File::KDBX::Error->error($message, %details);
211 Wrap a thing to make it an error object. If the thing is already an error, it gets returned. Otherwise what is
212 passed will be forwarded to L</new> to create a new error object.
214 This can be convenient for error handling when you're not sure what the exception is but you want to treat it
215 as a B<File::KDBX::Error>. Example:
218 if (my $error = error(@_)) {
219 if ($error->type eq 'key.missing') {
220 handle_missing_key($error);
223 handle_other_error($error);
229 $message = $error->to_string;
234 This does not contain a stack trace, but you can set the C<DEBUG> environment variable to at least 2 to
235 stringify the whole error object.
239 File::KDBX::Error::throw($message, %details);
246 File::KDBX::Error::warn($message, %details);
255 Importable alias for L</warn>.
259 Please report any bugs or feature requests on the bugtracker website
260 L<https://github.com/chazmcgarvey/File-KDBX/issues>
262 When submitting a bug or request, please include a test-file or a
263 patch to an existing test-file that illustrates the bug or desired
268 Charles McGarvey <ccm@cpan.org>
270 =head1 COPYRIGHT AND LICENSE
272 This software is copyright (c) 2022 by Charles McGarvey.
274 This is free software; you can redistribute it and/or modify it under
275 the same terms as the Perl 5 programming language system itself.
This page took 0.048621 seconds and 3 git commands to generate.