http://www.perlmonks.org?node_id=1017047


in reply to Creating exception classes

use strict; use warnings; use 5.012; use Exception::Class ( 'MyException', 'CommandException' => { isa => 'MyException' }, 'TimeoutException' => { isa => 'CommandException', description => 'This exception resulted from running the metrics commands' }, 'DBException' => { isa => 'MyException', description => 'DB returned error' } ); &ThrowMyException(); sub ThrowMyException() { eval{ TimeoutException->throw(error=>"This is error due to timeout +") }; my $err; if ($err = Exception::Class->caught('TimeoutException') ) { #print Dumper($err); #print "err is of type ".ref($err); die $err->description . ": " . $err->error; } elsif ( $err = Exception::Class->caught("MetricsException") ) { #print Dumper($err); die $err->error; } }

If you see class names like A::B::C, that means the class is named C and it can be found in the directory A/B/. The A::B:: part is a namespace name to prevent name conflicts, but it also indicates the directory structure where the class is located. When you write A::B::C in your program, perl searches all the directories in @INC for a directory named A that has a subdirectory named B, which contains a file called C.pm.

Replies are listed 'Best First'.
Re^2: Creating exception classes
by tobyink (Canon) on Feb 05, 2013 at 10:08 UTC

    "When you write A::B::C in your program, perl searches all the directories in @INC for a directory named A that has a subdirectory named B, which contains a file called C.pm."

    No it doesn't. It only does that search if you write use A::B::C, no A::B::C or require A::B::C. Merely mentioning the A::B::C package (for example, to call a constructor) does not force Perl to attempt to load the module.

    The following code does not attempt to load "This/File/Does/No/Exist/On/My/Disk.pm"...

    use strict; use warnings; { package This::File::Does::No::Exist::On::My::Disk; require Math::BigInt; our @ISA = 'Math::BigInt'; } my $number = This::File::Does::No::Exist::On::My::Disk->new(7); print $number * 6, "\n";
    package Cow { use Moo; has name => (is => 'lazy', default => sub { 'Mooington' }) } say Cow->new->name