Philipp Hasenfratz: OOP Error-/ExceptionHandling

Beitrag lesen

Halihallo Christian

http://search.cpan.org/~mouns/PException-2.4/PException.pm
benutzen, vielleicht kommt das deinen Bedürfnissen ja eher entgegen.

Auch ein guter Vorschlag, Danke!

Ich habe mich für folgende Lösung entschieden:

dem 'die' wird eine neue Error-Instanz übergeben. Diese Error
Instanz erbt von einer Basisklasse Exception, welche im stringified-
Kontext die Fehlerbeschreibung ausgibt. Falls also 'die' nicht über
eval oder __DIE__ Signal abgefangen wird, wird einfach der Fehler
ausgegeben. Falls er abgefangen wird, kann man über ein Exception-
Handling auf die Exception-Instanz zugreifen (welche z.B. in
Anlehung an Java auch ein StackTrace implementiert).
So habe ich
a) einen ganz normalen 'die', falls nicht abgefangen.
   Über '""' overloading erreiche ich eine ganz normale, stringified
   Fehlermeldung, die von CORE::die ausgegeben wird, falls abgefangen
   kann auf die Instanz zugegriffen werden.
b) eine einfache Möglichkeit Fehler über __DIE__ Signal auszuwerten
   und darauf zu reagieren
c) kein Laden von PException oder was auch immer in jeder Klasse.

Folgendes kleines Beispiel zur demonstation meiner momentanen Lösung:
------------------------------------
#!/usr/bin/perl

package Exception;

use overload '""' => &to_string;
use strict;
use warnings;

sub new {
  my ($class,$code,$stringified) = @_;
  bless {code=>$code,str=>$stringified}, $class;
}

sub to_string($) {
  my ($self) = @_;
  return "$self->{code} - $self->{str}\n";
}

package main;

use strict;
use warnings;
use base qw(Exception);

die new Exception('ERR_DATABASE_CONNECTION_REFUSED', 'Verbindungsaufbau zur Datenbank fehlgeschlagen!');

or

local $SIG{__DIE__} = sub {
  my ($exception) = @_;
  # do something with object $exception
  print $exception->{code};
  exit(255);
};

die new Exception('ERR_INVALID_CHARACTER', 'Ungültiges Zeichen!');
----------------------------------

Viele Grüsse

Philipp