Leser: 22
2014-09-23T08:03:16 rostiWeil der Programmierer nicht Perl so missbrauchen sollte.Was mich ein bischen irritiert ist, dass der Autor der Lib zur Fehlerbehandlung $! durchreicht und das nicht auf $@ umlegt. Gibt es einen guten Grund dafür?
Quote$OS_ERROR
$ERRNO
$!
When referenced, $! retrieves the current value of the C errno integer variable. If $! is assigned a numerical value, that value is stored in errno . When referenced as a string, $! yields the system error string corresponding to errno .
Many system or library calls set errno if they fail, to indicate the cause of failure. They usually do not set errno to zero if they succeed. This means errno , hence $! , is meaningful only immediately after a failure:
Code (perl): (dl )1 2 3 4 5 6 7 8 9 10 11if (open my $fh, "<", $filename) { # Here $! is meaningless. ... } else { # ONLY here is $! meaningful. ... # Already here $! might be meaningless. } # Since here we might have either success or failure, # $! is meaningless.
Here, meaningless means that $! may be unrelated to the outcome of the open() operator. Assignment to $! is similarly ephemeral. It can be used immediately before invoking the die() operator, to set the exit value, or to inspect the system error string corresponding to error n, or to restore $! to a meaningful state.
Note that when stringified, the text is always returned as if both use locale and use bytes are in effect. This is likely to change in v5.22.
Mnemonic: What just went bang?
Quote$EVAL_ERROR
$@
The Perl syntax error message from the last eval() operator. If $@ is the null string, the last eval() parsed and executed correctly (although the operations you invoked may have failed in the normal fashion).
Warning messages are not collected in this variable. You can, however, set up a routine to process warnings by setting $SIG{__WARN__} as described in %SIG.
Mnemonic: Where was the syntax error "at"?
2014-09-23T08:03:16 rostiWas mich ein bischen irritiert ist, dass der Autor der Lib zur Fehlerbehandlung $! durchreicht und das nicht auf $@ umlegt. Gibt es einen guten Grund dafür?
Splitted from scp_get mit Net::SSH2 bringt leere Datei msg #177463
my $kfz = KFZ->new( machine => 'Otto') or die KFZ->error;
2014-09-25T08:07:24 MuffiHat dir eigentlich schon mal wer gesagt, also außer mir, dass du den Drang hast Dinge anders zu lösen als der Rest?
Das wär eigentlich der in Perl gängige Weg
Code (perl): (dl )my $kfz = KFZ->new( machine => 'Otto') or die KFZ->error;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
my $error; sub error { return $error; } sub new{ my $class = shift; my %cfg = ( machine => '', @_ ); unless ($cfg{machine} eq 'Diesel' or $cfg{machine} eq 'Otto') { $error = "Machine Diese||Otto"; return; } return bless { machine => $cfg{machine}, }, $class; }
1 2 3 4 5 6 7 8 9 10
my %error; sub error { return $error{$$}; } sub wo_was_daneben_geht { $error{$$} = 'uiui'; return; }
my $kfz = KFZ->new( machine => 'Diesel') or die $@;
2014-09-25T10:25:24 reneeIch persönlich finde es ungewohnt ein $@ ohne ein eval zu sehen...
1 2 3 4
use Net::FTP; $ftp = Net::FTP->new("some.host.name", Debug => 0) or die "Cannot connect to some.host.name: $@";
2014-09-25T09:04:48 GwenDragoneval schluckt bei deinen Programmcode mit Perl 5.14 ca. 6% Laufzeit. Überprüfe es mal mit Benchmark.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#!/usr/bin/perl use strict; use warnings; use Carp; sub new{ my $class = shift; my $arg = shift; return eval{ croak "Argument ist nicht definiert"} unless defined $arg; return bless{ ARG => $arg, }, $class; } my $main = main->new() or die "Die Instanz konnte nicht erstellt werden, Fehler: $@";
2014-09-29T04:57:50 MuffiWarum nimmst du da eigentlich croak statt die?
1 2 3 4 5 6 7 8 9 10 11 12
#!/usr/bin/perl use strict; use warnings; use IO::File; use Carp; use Data::Dumper; my $fh = IO::File->new; eval{$fh->open("asdf", "r") || croak $!}; print Dumper $!, $@;
1
2
3
4
$VAR1 = 'No such file or directory';
$VAR2 = 'No such file or directory at C:\\Dokumente und Einstellungen\\rolf\\Desktop\\pack.pl line 10.
eval {...} called at C:\\Dokumente und Einstellungen\\rolf\\Desktop\\pack.pl line 10
';
return eval{ croak "Argument ist nicht definiert"}
1 2
my $cfg = main->configini("/path/cfg.ini") or die "Fehler: $Config::Tiny::errstr";
2015-01-12T07:32:06 MuffiNaja, wenn du schon eine zusätzliche Abstraktionsschicht für ini-einlesen einführst, dann doch konsequenterweise auch für die Fehlerbehandlung.
1 2 3 4 5 6
# Es wird der Erfolg einer Methodenausführung festgestellt my $result = $instanz->methode(ARGS) or return $instanz->fehlerseite(FEHLERGRUND); # or die "FEHLERGRUND"; # or die $@; # or return $instanz->fehlerseite($@);
my $sca = Scaliger->new(date => "1.1.$year") or die $@;