summaryrefslogtreecommitdiff
path: root/lib/Moose/Manual/Exceptions.pod
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2015-06-06 17:50:16 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2015-06-06 17:50:16 +0000
commit5ac2026f7eed78958d69d051e7a8e993dcf51205 (patch)
tree298c3d2f08bdfe5689998b11892d72a897985be1 /lib/Moose/Manual/Exceptions.pod
downloadMoose-tarball-5ac2026f7eed78958d69d051e7a8e993dcf51205.tar.gz
Diffstat (limited to 'lib/Moose/Manual/Exceptions.pod')
-rw-r--r--lib/Moose/Manual/Exceptions.pod239
1 files changed, 239 insertions, 0 deletions
diff --git a/lib/Moose/Manual/Exceptions.pod b/lib/Moose/Manual/Exceptions.pod
new file mode 100644
index 0000000..61435a2
--- /dev/null
+++ b/lib/Moose/Manual/Exceptions.pod
@@ -0,0 +1,239 @@
+# PODNAME: Moose::Manual::Exceptions
+# ABSTRACT: Moose's exceptions
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+Moose::Manual::Exceptions - Moose's exceptions
+
+=head1 VERSION
+
+version 2.1405
+
+=head1 EXCEPTIONS IN MOOSE
+
+Moose will throw an exception for all error conditions. This applies both to
+code in the Moose core I<as well> as to all code generated when a class is
+made immutable. All exceptions are subclasses of the C<Moose::Exception>
+class.
+
+Each type of error has its own unique subclass, and many subclasses have
+additional attributes to provide more information about the error's context,
+such as what classes or roles were involved.
+
+=head1 EXCEPTION STRINGIFICATION
+
+By default, Moose exceptions remove Moose internals from the stack trace. If
+you set the C<MOOSE_FULL_EXCEPTION> environment variable to a true value, then
+the Moose internals will be included in the trace.
+
+=head1 HANDLING MOOSE EXCEPTIONS
+
+Because Moose's exceptions use the standard C<die> mechanism, you are free to
+catch and handle errors however you like. You could use an C<eval> block to
+catch Moose exceptions. However, the Moose team strongly recommends using
+L<Try::Tiny> instead. Please refer to L<Try::Tiny>'s documentation for a
+discussion of how C<eval> is dangerous.
+
+The following example demonstrates how to catch and inspect a
+L<Moose::Exception>. For the sake of simplicity, we will cause a very simple
+error. The C<extends> keywords expects a list of superclass names. If we pass
+no superclass names, Moose will throw an instance of
+L<Moose::Exception::ExtendsMissingArgs>.
+
+=head2 Catching with Try::Tiny
+
+ use warnings;
+ use strict;
+ use Try::Tiny;
+
+ try {
+ package Example::Exception;
+ use Moose;
+ extends; # <-- error!
+ }
+ catch {
+ # $_ contains the instance of the exception thrown by the above try
+ # block, but $_ may get clobbered, so we should copy its value to
+ # another variable.
+ my $e = $_;
+
+ # Exception objects are not ubiquitous in Perl, so we must check
+ # whether $e is blessed. We also need to ensure that $e is actually
+ # the kind of exception we were expecting.
+ if ( blessed $e
+ && $e->isa('Moose::Exception::ExtendsMissingArgs') ) {
+
+ my $class_name = $e->class_name;
+ warn "You forgot to specify a superclass for $class_name, silly!";
+ }
+
+ # It's either another type of an object or not an object at all.
+ else {
+ warn "$e\n";
+ }
+ }
+
+=head2 Example of catching ValidationFailedForTypeConstraint
+
+ use warnings;
+ use strict;
+
+ use Try::Tiny;
+
+ {
+ package Person;
+ use Moose;
+ use Moose::Util::TypeConstraints;
+
+ subtype 'NameStr',
+ as 'Str',
+ where { $_ =~ /^[a-zA-Z]+$/; };
+
+ has age => (
+ is => 'ro',
+ isa => 'Int',
+ required => 1
+ );
+
+ has name => (
+ is => 'ro',
+ isa => 'NameStr',
+ required => 1
+ );
+ }
+
+ my $person;
+ while ( !$person ) {
+ try {
+ print 'Enter your age : ';
+ my $age = <STDIN>;
+ chomp $age;
+ print 'Enter your name : ';
+ my $name = <STDIN>;
+ chomp $name;
+ $person = Person->new(
+ age => $age,
+ name => $name
+ );
+ my $person_name = $person->name;
+ my $person_age = $person->age;
+ print "$person_name is $person_age years old\n";
+ }
+ catch {
+ my $e = $_;
+
+ if (
+ blessed $e
+ && $e->isa(
+ 'Moose::Exception::ValidationFailedForTypeConstraint')
+ ) {
+
+ my $attribute_name = $e->attribute->name;
+ my $type_name = $e->type->name;
+ my $value = $e->value;
+
+ warn
+ "You entered $value for $attribute_name, which is not a $type_name!";
+ }
+ else {
+ warn "$e\n";
+ }
+ }
+ }
+
+=head2 Example of catching AttributeIsRequired
+
+ use warnings;
+ use strict;
+ use Try::Tiny;
+
+ {
+ package Example::RequiredAttribute;
+ use Moose;
+
+ has required_attribute => (
+ is => 'ro',
+ isa => 'Int',
+ required => 1
+ );
+ }
+
+ try {
+ # we're not passing required_attribute, so it'll throw an exception
+ my $object = Example::RequiredAttribute->new();
+ }
+ catch {
+ my $e = $_;
+ if ( blessed $e && $e->isa('Moose::Exception::AttributeIsRequired') )
+ {
+ warn $e->message, "\n";
+ }
+ else {
+ warn "$e\n";
+ }
+ };
+
+=head1 MOOSE EXCEPTION CLASSES
+
+All the exception classes are listed in L<Moose::Manual::Exceptions::Manifest>.
+
+=head1 AUTHORS
+
+=over 4
+
+=item *
+
+Stevan Little <stevan.little@iinteractive.com>
+
+=item *
+
+Dave Rolsky <autarch@urth.org>
+
+=item *
+
+Jesse Luehrs <doy@tozt.net>
+
+=item *
+
+Shawn M Moore <code@sartak.org>
+
+=item *
+
+יובל קוג'מן (Yuval Kogman) <nothingmuch@woobling.org>
+
+=item *
+
+Karen Etheridge <ether@cpan.org>
+
+=item *
+
+Florian Ragwitz <rafl@debian.org>
+
+=item *
+
+Hans Dieter Pearcey <hdp@weftsoar.net>
+
+=item *
+
+Chris Prather <chris@prather.org>
+
+=item *
+
+Matt S Trout <mst@shadowcat.co.uk>
+
+=back
+
+=head1 COPYRIGHT AND LICENSE
+
+This software is copyright (c) 2006 by Infinity Interactive, Inc..
+
+This is free software; you can redistribute it and/or modify it under
+the same terms as the Perl 5 programming language system itself.
+
+=cut