Schrift
[thread]8848[/thread]

Programm-Abbruch verhindern: Kei nAbbruch wenn open-funktion fehler

Leser: 1


<< |< 1 2 >| >> 15 Einträge, 2 Seiten
rommi
 2007-03-17 12:39
#75104 #75104
User since
2005-03-03
54 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

ich habe ein Programm dass ein Array hat mit mehreren Datei-namen. Beim späteren open der Dateien in einer foreach-Schleife bricht das Programm sofort ab wenn es den Datei-namen nicht findet! Wie kann ich den Abbrch vermeiden damit die verbleibenden Array-Inhalte trotzdem in der foreach-schleife verarbeitet werden?

@array = ("datei1", "datei2", "datei3"); usw.
foreach(@array)
{
open(DATEI, "<z:\\$_") or die "kann $_ nicht oeffnen\n";
blah blah;
}

Gruss und Danke
rommi
renee
 2007-03-17 12:51
#75105 #75105
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
@array = ("datei1", "datei2", "datei3");
foreach(@array)
{
unless(open(DATEI, "<z:\\$_")){
next;
}
else{
# lese datei ein...
}
}
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/
rommi
 2007-03-17 13:34
#75106 #75106
User since
2005-03-03
54 Artikel
BenutzerIn
[default_avatar]
Hallo renee!

danke für die Antwort! Aber gibts es da nicht irgendeinen Parameter beim Programmaufruf oder irgendeine Programmanweisung (wie z.B. use strict etc.) dass Fehler ignoriert werden und das Programm dann weiter läuft.

Ich dachte ich hätte irgendwo soetwas schon mal gesehen, aber wenn man sich nicht gleich alles aufschreibt dann.....

Vielleicht täusche ich mich ja auch. Sehe schon Perl-Gespenster....lol

Gruss
rommi
bloonix
 2007-03-17 13:42
#75107 #75107
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo rommi,

ich schätze einfach mal, dass du nicht verstanden hast, was ein
"use strict" und was ein "or die()" macht.

Wenn du coden möchtest, dann solltest du verstehen, was du codest.
Via Copy&Paste Code übernehmen macht da alleine keinen Sinn, denn
dann dauert es nicht lange, bis du die nächste Frage diesbezüglich
stellst. :)

Gruss,
opi\n\n

<!--EDIT|opi|1174131815-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
rommi
 2007-03-17 15:00
#75108 #75108
User since
2005-03-03
54 Artikel
BenutzerIn
[default_avatar]
Hallo opi,

wenn du mal meine Beiträge zählen würdest wüsstest du dass ich sehr selten eine Frage stelle und es wahrscheinlich auch in Zukunft nicht oft vorkommt !! Könntest du jetzt mal auf meine Frage antworten? Ansonsten benötige ich keine weiteren Tipps! Danke!

Gruss
rommi
MisterL
 2007-03-17 16:25
#75109 #75109
User since
2006-07-05
334 Artikel
BenutzerIn
[default_avatar]
Dazu könnte man die Dateinamen eines Verzeichnisses im Vorhinein einlesen und dann alle Dateien mit z.B. der Endung .txt beim Öffnen nacheinander abarbeiten. Was vielleicht nicht besonders intelligent ist, wenn man von 100.000 existenten Dateien nur 2 bearbeiten will.... ;-)

Gruss MisterL\n\n

<!--EDIT|MisterL|1174141868-->
“Perl is the only language that looks the same before and after RSA encryption.”
rommi
 2007-03-17 16:49
#75110 #75110
User since
2005-03-03
54 Artikel
BenutzerIn
[default_avatar]
Hallo MisterL,

das wäre natürlich möglich! Um das ist es mir im moment nicht gegangen. Wie schon gesagt ware ich mehr auf der Suche nach einer Programmeinstellung die auch nach einem erfolglosen open einer Datei das Programm nicht abbricht. Da gab es mal irgendso ne Einstellung oder einen Programm-Parameter der solche Abbrüche verhindert. Aber leider weiss ich es nicht mehr und habe auf die Schnelle nix gefunden! Auf jeden Fall vielen Dank für deine Antwort :-). Is auch nicht so wichtig!

Gruss
rommi
bloonix
 2007-03-17 17:14
#75111 #75111
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo rommi,

[quote=rommi,17.03.2007, 14:00]wenn du mal meine Beiträge zählen würdest wüsstest du dass ich sehr selten eine Frage stelle und es wahrscheinlich auch in Zukunft nicht oft vorkommt !![/quote]

die Anzahl deiner Beiträge ist mir wurscht. Das hätte ich auch zu
jemanden geschrieben, der weit aus mehr Beiträge geschrieben hat.
Zudem ist hier fast jeder Beitrag willkommen. In Foren ist das nun mal
so, dass man Antworten bekommt, die jemanden darauf hinweisen,
das Dokumentationen nicht beissen. ;)

[quote=rommi,17.03.2007, 14:00]Könntest du jetzt mal auf meine Frage antworten?[/quote]

Ja, gerne.

Quote
Aber gibts es da nicht irgendeinen Parameter beim Programmaufruf oder irgendeine Programmanweisung (wie z.B. use strict etc.) dass Fehler ignoriert werden und das Programm dann weiter läuft.


Gibt es und zwar genau das Beispiel, was dir renee schon gezeigt hat.
Du kannst fast alles in eine if-Anweisung packen oder auf Fehler mit
einem "or" reagieren. Das ist auch der Grund, weshalb ich mein Comment
abgegeben habe... ich hatte einfach das Gefühl, dass du zwar sehr
löblich

open ... or die ()

benutzt, aber nicht weißt, was man damit alles machen kann. Es ist zum
Beispiel möglich do{} oder eine Routine oder was auch immer aufzurufen.

Code: (dl )
1
2
3
4
5
open my $fh, '<', $file or do {
  print STDERR "Konnte Datei $file nicht oeffnen: $!"
  print STDERR "Versuche naechste Datei zu oeffnen...\n";
  next;
};


oder

Code: (dl )
1
2
3
4
5
6
7
open my $fh, '<', $file or fehler_routine($file, $!);

sub fehler_routine {
  my $file = shift;
  my $fehler = shift;
  # fehler verarbeiten
}


Gruss,
opi\n\n

<!--EDIT|opi|1174160481-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
topeg
 2007-03-17 18:55
#75112 #75112
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Um mich kurz zu fassen. Es macht keinen Sinn ein "die" zu unterdrücken, denn immerhin steht ein "die" im Programm immer dort, wo man das Programm bei einem Fehler beeneden will. Willst du das nicht, benutze dort "warn" oder ähnliches. Das das Programm an der stelle "open(...) or die" abbricht ist von dir offensichtlich vorgesehen, denn sonst hättest du doch "unless(open(...)){warn(...)}else{...}" o.ä. geschrieben.

Aber da Perl auch für solche Fälle etwas bietet kannst du auch die "die" Funktion überschreiben:
Code (perl): (dl )
$SIG{__DIE__}=sub{ warn "Fehler: $_[0]" };

Hier wird nun bei jedem "die" im Code nicht der fehler ausgeben und dann das Programm beendet sondern nur der Fehler ausgeben. Man sollte sich aber gündlich Überlegen was man da macht, denn damit wird das Verhalten von __JEDEM__ "die" im Code verändert!

Und Konstrukte wie
Code (perl): (dl )
open(DAT,'<',$datei) or die "Fehler ($!)"
kann dann zu einem sehr seltsamen Verhalten des Programmes führen, da der nachfolgende Code ausgeführt wird. Wenn die datei nicht geöffnet wurde kann daraus auch nicht gelesen werden und diese kann dann auch nicht wieder geschossen werden.\n\n

<!--EDIT|topeg|1174150911-->
bloonix
 2007-03-17 19:55
#75113 #75113
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=topeg,17.03.2007, 17:55]Und Konstrukte wie
Code (perl): (dl )
open(DAT,'<',$datei) or die "Fehler ($!)"
kann dann zu einem sehr seltsamen Verhalten des Programmes führen, da der nachfolgende Code ausgeführt wird.[/quote]
Nein, das ist nicht ganz korrekt. Wenn du ein die() ausführst, stirbt
das Skript auf jeden Fall. Nachfolgender Code wird nicht mehr ausge-
führt, es sei, er steht in der Subroutine. Mit

$SIG{__DIE__}=sub{ warn "Fehler: $_[0]" };

wird zwar warn() ausgeführt, aber das Skript stirbt danach definitiv.

Code: (dl )
1
2
3
4
5
6
7
8
use strict;
use warnings;

$SIG{__DIE__}=sub{ warn "Fehler: $_[0]" };

die "hier stirbt das Skript definitiv!";

print "test\n";


Fehler: hier stirbt das Skript definitiv! at ./test.pl line 7.
hier stirbt das Skript definitiv! at ./test.pl line 7.


Die Meldung wird zwei Mal ausgegeben. Um das zu vermeiden, muss
in der anonymen Routine ein exit() ausgeführt werden.\n\n

<!--EDIT|opi|1174154224-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2007-03-17 12:39.