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 to Exception::Died::__WARN__ function.

use Exception::Died '%SIG' => 'die';

Changes $SIG{__WARN__} hook to Exception::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

Exception::Base.

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.

See http://www.perl.com/perl/misc/Artistic.html