Schrift
[thread]11498[/thread]

Fehler überprüfung

Leser: 1


<< |< 1 2 >| >> 12 Einträge, 2 Seiten
aspnstyle
 2008-03-20 17:20
#107289 #107289
User since
2008-03-18
23 Artikel
BenutzerIn
[default_avatar]
vielen dank für deine rasche antwort renee

hab mir den Befehl eval jetzt nochmal in google genauer betrachtet aber bin noch auf keine gute Seite gestoßen.

ja genau ich lese den ordner mit einer schleife aus und während dessen führe ich den Befehl aus

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
...
while( my $Datei = readdir DIR ){

        if ( $Datei =~ /\.doc$/i ){
 my $Word = Win32::OLE->new('Word.Application', 'Quit');
2:                 $Word->{'Visible'} = $debug;         # if you want to see what's going on
3:                 $Word->Documents->Open("$plpath$tmp_mail$Datei") || die("Unable to open document ", Win32::OLE->LastError());
4:                 
5:                 my $Versender1 = $Word->ActiveDocument->FormFields("Text1")->Result;         
6:                 my $Versender2 = $Word->ActiveDocument->FormFields("Text18")->Result;         
7:                 my $VersStr = $Word->ActiveDocument->FormFields("Text20")->Result;
....    
        $Word->Quit();
}
}


eval - Mit Hilfe der eval-Funktion können Sie jedoch den Perl-Interpreter während der Laufzeit eines Scripts aufrufen und innerhalb des Scripts beliebigen Perl-Code interpretieren lassen. Wenn Sie so wollen, kann ein Perl-Script auf diese Weise selber Perl-Scripts schreiben und deren Ausführung in die eigene Ausführung einbetten. In die Code-Erzeugung dürfen natürlich auch Variableninhalte einfließen, die das Script verwaltet....

könntest du mir das anhand dem bsp kurz erklären ... versteh das noch nicht ganz wieso man nicht einfach eine if abfrage machen kann ob das formfield vorhanden ist und wenn nicht $word->Quit; und mit dem nächsten weiter machen....

:D ich hänge in letzter zeit wirklich nur mehr 24 stunden am perl lernen ... wieso ich da nicht schon früher drauf gekommen bin *gg* das macht wirklich spaß

Auf jeden fall vielen lieben dank an alle moderatoren und mitglieder
aspnstyle
 2008-03-20 16:04
#107307 #107307
User since
2008-03-18
23 Artikel
BenutzerIn
[default_avatar]
Hallo leute ich hab wiedereinmal ein kleines Problem.

Ich habe ein script das mir einen Ordner ausliest und auf *.*doc Dokumente untersucht wenn ein doc vorhanden ist dann wendet er folgende Code an

Code (perl): (dl )
1
2
3
4
5
6
7
my $Word = Win32::OLE->new('Word.Application', 'Quit');
                $Word->{'Visible'} = $debug;         # if you want to see what's going on
                $Word->Documents->Open("$plpath$tmp_mail$Datei") || die("Unable to open document ", Win32::OLE->LastError());
                
                my $Versender1 = $Word->ActiveDocument->FormFields("Text1")->Result;         
                my $Versender2 = $Word->ActiveDocument->FormFields("Text18")->Result;         
                my $VersStr = $Word->ActiveDocument->FormFields("Text20")->Result;    


Sprick er öffnet es und übergibt den Wert von den folgenden FormFields an eine Variable.

Mein problem ist nun wenn es ein falsches *.*doc ist das keine FormFields hat dann beendet es mir das Script... ich möchte jetzt wenn er ein fehler bringt übersprint er mir einfach das file und macht mit den anderen weitern dass es schön weiter läuft...

wie stelle ich das am besten an?

Vielen lieben Dank
renee
 2008-03-20 16:12
#107308 #107308
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Mit einem Block-eval und der Variablen $@. Ein Beispielcode für eval:
Code (perl): (dl )
1
2
3
4
5
6
7
8
#!/usr/bin/perl

use strict;
use warnings;

eval{
   die 7;
} or do{  die "died with $@" };


Ich nehme mal an, dass Du den obigen Code in einer Schleife verwendest. Dann musst Du im do-Teil ein next (perldoc -f next) machen.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2008-03-20 16:15
#107309 #107309
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Hier noch ein Beispiel mit Schleife...
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl

use strict;
use warnings;

for(0..9) {
    eval{
       die 7 if $_ == 7;
       print $_,"\n";
    } or do{  next; };
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2008-03-20 18:20
#107314 #107314
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
aspnstyle+2008-03-20 16:20:39--
könntest du mir das anhand dem bsp kurz erklären ... versteh das noch nicht ganz wieso man nicht einfach eine if abfrage machen kann ob das formfield vorhanden ist und wenn nicht $word->Quit; und mit dem nächsten weiter machen....


Ich kenne das Modul nicht auswendig und Du hast gesagt, dass das Programm abbricht...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
murphy
 2008-03-20 18:27
#107315 #107315
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
aspnstyle+2008-03-20 16:20:39--
eval - Mit Hilfe der eval-Funktion können Sie jedoch den Perl-Interpreter während der Laufzeit eines Scripts aufrufen und innerhalb des Scripts beliebigen Perl-Code interpretieren lassen. [...]


Das ist zwar im Prinzip richtig, eval bietet neben der Möglichkeit einen String als Perlcode ausführen zu lassen aber auch noch die Möglichkeit einfach einen bereits kompilierten Anweisungsblock auszuführen. In beiden Fällen bietet eval ähnliche Funktionalität wie try { ... } catch ... in vielen anderen Sprachen.

Am besten einfach mal -f eval lesen...

Quote
[...] versteh das noch nicht ganz wieso man nicht einfach eine if abfrage machen kann ob das formfield vorhanden ist und wenn nicht $word->Quit; und mit dem nächsten weiter machen [...]


Wieso sollte man das nicht machen können? Sofern Word eine Funktion anbietet, mit der diese Überprüfung möglich ist, kann das durchaus eine sinnvolle Lösung sein. Ob Du das Problem lieber mit expliziten Abfragen oder lieber mit Exceptionhandling lösen willst, ist hauptsächlich eine Geschmacksfrage.

Tendenziell würde ich persönlich eine explizite Abfrage immer dann bevorzugen, wenn diese nicht viel zusätzlichen Rechenaufwand bedeutet und ich außerdem nur in einer ganz bestimmten Situation das Auftreten eines Fehlers durch speziellen Code umschiffen möchte, während andere Fehlertypen weiterhin das Programm abbrechen sollen.

Eine Exceptionbehandlung würde ich bevorzugen, wenn die Umgehung von Fehlersituationen durch Abfragen zu zeitaufwendig oder umständlich ist oder ich sowieso große Klassen von Fehlern abfangen und summarisch behandeln möchte – zum Beispiel indem bei jeder Art von Fehler in der OLE-Kommunikation einfach eine Meldung ausgegeben und die Datei übersprungen würde.
When C++ is your hammer, every problem looks like your thumb.
aspnstyle
 2008-03-20 20:32
#107316 #107316
User since
2008-03-18
23 Artikel
BenutzerIn
[default_avatar]
Erstmal vielen dank euch beiden :) habt mir auf jeden fall schon mal weiter geholfen

@renee
Ich glaube wir haben uns oben einwenig falsch verstanden. Meine Frage war wo ich das in meinem Code einbetten müsste und ob du mir die funktion eval in deinem Bsp näher bringen könntest. Ich diese eine Zeile in dem code leider nicht...

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
 #!/usr/bin/perl
 
 use strict;
 use warnings;

 for(0..9) { #Schleifenanfang
     eval{ #eval Funktion
        die 7 if $_ == 7; # ???
        print $_,"\n"; # Ausgabe der std. Variable $_
     } or do{  next; }; # ok redo,last,next kenn ich ja seit gestern :)
 }
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.
renee
 2008-03-21 01:17
#107325 #107325
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
murphy+2008-03-20 20:53:57--
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.


Auch das ist nicht sicher, da $@ zwischen dem eval und dem if theoretisch verändert worden sein kann!

Ich muss mal den use.perl.org-Eintrag suchen, der das beschreibt...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
murphy
 2008-03-21 02:32
#107326 #107326
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
@renee: Wenn man zwischen dem eval und der Überprüfung von $@ keine weiteren Operationen ausführt, könnte die Variable doch höchstens aus einem Signalhandler modifiziert werden, oder?
When C++ is your hammer, every problem looks like your thumb.
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2008-03-20 16:04.