Schrift
[thread]7993[/thread]

"or die $!" bei Funktionsaufruf



<< |< 1 2 >| >> 17 Einträge, 2 Seiten
bloonix
 2006-05-18 16:42
#66273 #66273
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo Leute,

folgendes Problem habe ich...

test111.pl
Code: (dl )
1
2
3
4
5
6
7
#!/usr/bin/perl
use strict;
use warnings;
use lib '.';
use test111;

test111->do_open() or die $!;


test111.pm
Code: (dl )
1
2
3
4
5
6
7
8
package test111;

sub do_open {
# ./datei gibt es nicht
  open my $FH,'<','./datei' or return;
}

1;


Datei oder Verzeichnis nicht gefunden at ./test111.pl line 7.

Leider erhalte ich nicht die Fehlermeldung, die ich erwarten
würde und zwar, dass das open in Zeile 4 von test111.pm
fehlgeschlagen ist. Was muss ich tun, damit ich den genauen
Ort des Fehlers feststellen kann?

Ich möchte das "die" nicht nach dem "open" in der Funktion
auslösen, da der Aufrufer selbst darüber entscheiden soll.

Viele Grüße,
opi\n\n

<!--EDIT|opi|1147956284-->
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.
pq
 2006-05-18 16:53
#66274 #66274
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
auszug aus der doku:
Code: (dl )
1
2
3
4
       $!      If used numerically, yields the current value of the C "errno"
              variable, or in other words, if a system or library call fails,
              it sets this variable.  This means that the value of $! is
              meaningful only immediately after a failure:


was du willst, ist:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
sub do_open {
 # ./datei gibt es nicht
 open my $FH,'<','./datei' or die $!;
}

.....

eval {
 do_open()
} or die "Fehler: $@";
\n\n

<!--EDIT|pq|1147956821-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
bloonix
 2006-05-18 17:04
#66275 #66275
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hi pq, gibt es nur diese Möglichkeit?

Der Aufrufer der Funktion soll nur dieses Konstrukt benutzen:

Code: (dl )
Modul->funktion() or die $!


In $! soll dann der Paketname und die "richtige" Zeilennummer
stehen oder auch eine Meldung, die ich selbst erstellt habe.\n\n

<!--EDIT|opi|1147957540-->
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.
pq
 2006-05-18 17:15
#66276 #66276
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=opi,18.05.2006, 15:04]Hi pq, gibt es nur diese Möglichkeit?[/quote]
ja, für das, was du haben willst, schon. in $! stehen fehler von
system/library calls. diese variable setzt man nicht selbst. dafür
sind die/eval/$@ da.
Quote
In $! soll dann der Paketname und die "richtige" Zeilennummer
stehen oder auch eine Meldung, die ich selbst erstellt habe.

genau das geht mit meinem beispiel.

edit: und außerdem ist es gängige praxis. vor allen dingen würde es mich
als aufrufer der funktion stören, dass in $! irgendetwas steht, was nicht
in perldoc perlvar dokumentiert ist.\n\n

<!--EDIT|pq|1147958751-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
nepos
 2006-05-18 17:16
#66277 #66277
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hm, eventuell bietet CPAN:Carp das, was du brauchst.
Dubu
 2006-05-18 17:28
#66278 #66278
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Leider keine Antwort auf deine Frage, aber ... :
Als Modulbenutzer fände ich es sehr irritierend, wenn ich als Folge einer Fehlerabfrage, die ich in meinen Code eingebaut habe, eine Fehlerzeile in einem benutzten Modul angegeben bekäme. Was soll ich damit machen? Erstmal müsste ich von Hand suchen, in welcher Zeile in meinem Code dieser Fehler ausgelöst wurde. Und was dann? Erwartet der Autor, dass ich das Modul debugge?

Nö, Fehlermeldungen dienen in erster Linie dazu, dass ich Fehler in meinem Code finden kann. Und wenn da wirklich keiner zu finden ist, dann kann ich immer noch das Modul debuggen. Oder gleich in die Tonne werfen.

Just my 2¢
bloonix
 2006-05-18 17:35
#66279 #66279
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=nepos,18.05.2006, 15:16]Hm, eventuell bietet CPAN:Carp das, was du brauchst.[/quote]
Ja, sowas habe ich gesucht! Danke :)
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.
pq
 2006-05-18 17:41
#66280 #66280
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=opi,18.05.2006, 15:35][quote=nepos,18.05.2006, 15:16]Hm, eventuell bietet CPAN:Carp das, was du brauchst.[/quote]
Ja, sowas habe ich gesucht! Danke :)[/quote]
dann schreib doch mal bitte, wie du es benutzt.
$! wird es dir wohl trotzdem nicht setzen.
und soweit ich Carp kenne, macht es eher das umgekehrte von dem,
was du willst, denn ein aufruf von carp/croak schreibt nicht die aktuelle
zeile, sondern die aufrufende in den fehlerstring. und genau das wolltest du ja nicht.\n\n

<!--EDIT|pq|1147959756-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
bloonix
 2006-05-18 17:54
#66281 #66281
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Code: (dl )
1
2
3
4
5
6
7
8
9
#!/usr/bin/perl
use strict;
use warnings;
use lib '.';
use test111;

my $liste = ['./datei1','./datei2','./datei3'];

test111->do_open($liste) or die $!;


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package test111;
use strict;
use warnings;
use Carp;

sub do_open {
  my $package = shift;
  my $liste = shift;
  foreach my $datei (@{$liste}) {
     open my $FH,'<',$datei or croak("Datei $datei konnte nicht geoeffnet werden, ",__PACKAGE__,":",__LINE__);
     close $FH;
  }
}

1;


[quote=pq,18.05.2006, 15:41]dann schreib doch mal bitte, wie du es benutzt.[/quote]
muss ich jetzt auch noch Rede und Antwort stehen, wo, wann,
wieso und warum ich das brauche? =)\n\n

<!--EDIT|opi|1147961556-->
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.
pq
 2006-05-18 18:11
#66282 #66282
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=opi,18.05.2006, 15:54][quote=pq,18.05.2006, 15:41]dann schreib doch mal bitte, wie du es benutzt.[/quote]
muss ich jetzt auch noch Rede und Antwort stehen, wo, wann,
wieso und warum ich das brauche? =)[/quote]
ähm, mich interessiert es halt, wie du es gelöst hast. und so, wie es
aussieht, hast du es eben doch nicht so gelöst, dass der aufrufer
sich entscheiden kann, ob er stirbt.
es klang nämlich so. deshalb meine nachfrage. es war eine einfache bitte.

so wie du es machst, hättest du auch gleich die() verwenden können.
croak "... __LINE__" gibt dir nämlich die zeile, in der du das croak()
aufrufst. die "..." macht das eh schon.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2006-05-18 16:42.