Thread Fehler überprüfung
(11 answers)
Opened by aspnstyle at 2008-03-20 16:04
@aspnstyle: die 7 if $_ == 7; bedeutet "wenn $_ gleich 7 ist, erzeuge einen fatalen Fehler mit der Fehlermeldung '7'". Da das ganze in einem eval-Block steht, wird der Fehler aber abgefangen und die Meldung in $@ gespeichert.
Dazu sollte man vielleicht noch anmerken, dass die Syntax mach_was if (is_was); generell äquivalent zu if (is_was) { mach_was } ist, aber nur funktioniert, wenn mach_was genau ein einziger Befehl und kein Block von mehreren Anweisungen ist. Ferner würde ich in der Regel lieber nicht eval { ... } or ...; schreiben, da das lediglich den Rückgabewert von eval überprüft, der auch dann falsch sein kann, wenn kein Fehler auftrat, sondern die letzte Anweisung im Block 0 oder undef zurückgegeben hat. Sicherer ist es, direkt $@ zu überprüfen. In Deinem Beispiel sähe das dann etwa so aus (ungetestet, denn ich habe kein Windoof zur Hand): Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 use strict; use warnings; use Win32::OLE; use File::Spec::Functions qw/catfile/; my $dir_path = $ARGV[0] or die "No directory argument given\n"; { open my $dir, $dir_path or die "Couldn't open $dir_path: $!\n"; # We only have to launch Word once before the loop and can keep it open # to improve performance... my $word = Win32::OLE->new('Word.Application', 'Quit') or die "Couldn't launch Word: " . Win32::OLE->LastError . "\n"; $word->{Visible} = $debug; while (my $file_name = readdir $dir) { next unless ($file_name =~ /\.doc$/i); my $file_path = catfile($dir_path, $file_name); if (my $document = $word->Documents->Open($file_path)) { eval { my $text1 = $document->FormFields('Text1')->Result; my $text18 = $document->FormFields('Text18')->Result; my $text20 = $document->FormFields('Text20')->Result; print "File($file_path) {\n text1: $text1,\n text18: $text18,\n text20: $text20\n}\n" }; warn "Error processing $file_name: $@\n" if ($@); $document->Close(); } else { warn "Couldn't open $file_name: " . Win32::OLE->LastError . "\n"; } } # Neither $dir nor $word have to be closed explicitly as they are both local objects whose # refcount drops to zero here and their destructors will close them as desired. } When C++ is your hammer, every problem looks like your thumb.
|