hi,
Warum es die Fehlersuche erschweren soll, musst du erklären.
Beispiel:
package MyClass;
use strict;
use warnings;
use Carp;
sub new{
my $class = shift;
my $fh = shift;
my $self = bless{}, $class;
return eval{
$self->{FH} = $fh or croak "Missing IO-File-Instance";
$self;
};
}
sub getFileContent{
my $self = shift;
my $filename = shift;
return eval{
$self->{FH}->open($filename, "r") or croak "IO-Err: $!";
read($self->{FH}, my $buffer, -s $self->{FH});
$self->{FH}->close;
$buffer;
};
}
package main;
use strict;
use warnings;
use IO::File;
use CGI;
my $fh = IO::File->new;
my $cgi = CGI->new;
my $obj = MyClass->new($cgi) or die $@;
# Übergebe das falsche Object in Zeile 38
my $fileContent = $obj->getFileContent("d:/tmp/cookiefile") or die $@;;
print $fileContent;
Und jetzt schauen wir uns mal die Fehlermeldung an:
Undefined subroutine CGI::open <
Was sagt das dem Anwender? Gar nichts. Ok, ich könnte das Modul, den Konstruktor verbessern:
sub new{
my $class = shift;
my $fh = shift;
my $self = bless{}, $class;
return eval{
croak "The argument is not a 'IO::File'" if ref $fh ne 'IO::File';
$self->{FH} = $fh or croak "Missing IO-File-Instance";
$self;
};
}
Und bekäme dann folgende FM:
The argument is not a 'IO::File' at pack.pl line 38 <
Da kann ich aber auch gleich selbst die Klasse IO::File in MyClass einbinden, das spart mir die Prüfung und dem Anwender der Klasse die extra notwendige Objekterstellung (mit einer eigenen Prüfung, ob die erfolgreich war).
Fertig:
package MyClass;
use strict;
use warnings;
use IO::File;
use Carp;
sub new{
my $class = shift;
my $self = bless{ FH => undef}, $class;
return eval{
$self->{FH} = IO::File->new or croak "Can' create FileHandle";
$self;
};
}
sub getFileContent{
my $self = shift;
my $filename = shift;
return eval{
$self->{FH}->open($filename, "r") or croak "IO-Err: $!";
read($self->{FH}, my $buffer, -s $self->{FH});
$self->{FH}->close;
$buffer;
};
}
package main; # AnwenderScript
use strict;
use warnings;
my $obj = MyClass->new() or die $@;;
my $fileContent = $obj->getFileContent("d:/tmp/cookiefile") or die $@;;
print $fileContent;
Hotti