Thread Fehler überprüfung (11 answers)
Opened by aspnstyle at 2008-03-20 16:04

murphy
 2008-03-20 21:53
#107319 #107319
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
@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.

View full thread Fehler überprüfung