Christian Kruse: OOP Error-/ExceptionHandling

Beitrag lesen

Hallo Philipp,

noch nichts von SIG__DIE__ gehört? :) Ich persönlich arbeite viel so:

$SIG{__DIE__} = &fatal;

open DAT,"blahr" or die "open blahr: $!\n";
close DAT;

sub fatal {
  my $err = shift;
  # tu was

exit;
}

Du kannst auch gern eine Objekts-Instanz oder so übergeben:

$SIG{__DIE__} = &fatal;
open DAT,"blahr" or die new ErrorClass("errortext");
close DAT;

sub fatal {
  my $err = shift;
  print $err->toString;
  exit;
}

package ErrorClass;

sub new {
  my ($class,$err) = @_;
  return bless {err => $err},ref($class)||$class;
}

sub toString {
  return shift->{err};
}

Geht eigentlich recht angenehm und braucht nicht diese ekeligen
eval-Konstrukte. Du kannst $SIG{__DIE__} sogar lokal überschreiben:

{
  local $SIG{__DIE__} = 'IGNORE';
  # ...
}

Ich hoffe, das hilft. Vorsicht aber: auch in eval()-Blöcken wird
der Callback von die() ausgeführt! Als ggf. überschreiben per local.

Grüße,
 CK

--
Q: God, root, what's the difference?
A: God is merciful.