NAME
Exception::Warning - Convert simple warn into real exception object
SYNOPSIS
# Convert warn into exception and throw it immediately
use Exception::Warning '%SIG' => 'die';
eval { warn "Boom!"; };
print ref $@; # "Exception::Warning"
print $@->warning; # "Boom!"
# Convert warn into exception without die
use Exception::Warning '%SIG' => 'warn', verbosity => 4;
warn "Boom!"; # dumps full stack trace
# Can be used in local scope only
use Exception::Warning;
{
local $SIG{__WARN__} = \&Exception::Warning::__WARN__;
warn "Boom!"; # warn via exception
}
warn "Boom!"; # standard warn
# Run Perl with verbose warnings
perl -MException::Warning=%SIG,warn,verbosity=>3 script.pl
# Run Perl which dies on first warning
perl -MException::Warning=%SIG,die,verbosity=>3 script.pl
# Run Perl which ignores any warnings
perl -MException::Warning=%SIG,warn,verbosity=>0 script.pl
DESCRIPTION
This class extends standard Exception::Base and converts warning into real exception object. The warning message is stored in warning attribute.
BASE CLASSES
IMPORTS
- use Exception::Died '%SIG';
- use Exception::Died '%SIG' => 'warn';
-
Changes
$SIG{__WARN__}
hook toException::Died::__WARN__
function. - use Exception::Died '%SIG' => 'die';
-
Changes
$SIG{__WARN__}
hook toException::Died::__DIE__
function.
CONSTANTS
- ATTRS
-
Declaration of class attributes as reference to hash.
See Exception::Base for details.
ATTRIBUTES
This class provides new attributes. See Exception::Base for other descriptions.
- message (rw, default: 'Unknown warning')
-
Contains the message of the exception. This class overrides the default value from Exception::Base class.
- warning (ro)
-
Contains the message which is set by
$SIG{__WARN__}
hook. - string_attributes (default: ['message', 'eval_error'])
-
Meta-attribute contains the format of string representation of exception object. This class overrides the default value from Exception::Base class.
- default_attribute (default: 'eval_error')
-
Meta-attribute contains the name of the default attribute. This class overrides the default value from Exception::Base class.
PRIVATE FUNCTIONS
- __WARN__
-
This is a hook function for $SIG{__WARN__}. It converts the warning into exception object which is immediately stringify to scalar and printed with
warn
core function. This hook can be enabled with pragma:use Exception::Died '%SIG' => 'warn';
or manually, i.e. for local scope:
local $SIG{__WARN__} = \&Exception::Died::__WARN__;
- __DIE__
-
This is a hook function for $SIG{__DIE__}. It converts the warning into exception object which is immediately thrown. This hook can be enabled with pragma:
use Exception::Died '%SIG' => 'die';
or manually, i.e. for local scope:
local $SIG{__WARN__} = \&Exception::Died::__DIE__;
PERFORMANCE
The Exception::Warning
module can change $SIG{__WARN__}
hook. It costs a speed for simple warn operation. It was tested against unhooked warn.
-------------------------------------------------------
| Module | run/s |
-------------------------------------------------------
| undef $SIG{__WARN__} | 276243/s |
-------------------------------------------------------
| $SIG{__WARN__} = sub { } | 188215/s |
-------------------------------------------------------
| Exception::Warning '%SIG' | 1997/s |
-------------------------------------------------------
| Exception::Warning '%SIG', verb.=>0 | 152348/s |
-------------------------------------------------------
It means that Exception::Warning
is significally slower than simple warn. It is usually used only for debugging purposes, so it shouldn't be an important problem.
SEE ALSO
BUGS
If you find the bug, please report it.
AUTHOR
Piotr Roszatycki <dexter@debian.org>
LICENSE
Copyright (C) 2008 by Piotr Roszatycki <dexter@debian.org>.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.