Cruz: DBI Error Handling

Hallo ihr da!

Ich habe ein recht komplexes System aus Perl Scripten und einer Oracle Datenbank. Ich benutze das DBI Modul für die DAtenbankverbindung. Ich würde gerne das System mit einem "stabilem" Error Handling ausstatten. Leider reicht mein Kenntnisstand über Error Handling gerade mal um zu wissen, daß in $! die aktuelle Errormeldung steht. (Ist in diesem Fall wohl auch nicht so wichtig).
Ich habe in der Doku vom DBI Modul ein paar nützliche Funtkionen wie...

errstr
errstate
errmsg

...gefunden. Allerdings habe ich noch nicht ganz kapiert, wie man sie richtig anwendet.

Was für Erfahrungen habt ihr denn mit Error Handling gemacht? Könnt ihr mir ein paar Tipps geben, wie ich es am besten angehen kann, und was ich dazu noch alles wissen sollte?

Als allererstes möchte ich Fehler abfangen, die durch eine verlorene Datenbankverbindung entstehen. (Die Verb. geht nämlich manchmal einfach nur so verloren).

Gruß und Danke für jeden Tipp
Cruz

  1. Hallo ihr da!

    Ich habe ein recht komplexes System aus Perl Scripten und einer Oracle Datenbank.
    ...gefunden. Allerdings habe ich noch nicht ganz kapiert, wie man sie richtig anwendet.

    Was für Erfahrungen habt ihr denn mit Error Handling gemacht?

    Gruß und Danke für jeden Tipp
    Cruz

    gruesse,
    ist  ja ein ganz schoener brocken. vorab: wenn Du's genau wissen willst, kauf Dir ein buch, und zwar
    'Programming the Perl DBI' von O'Reilley. (klingt nach spam, is aber nich, das buch ist wirklich gut)
    o.k.
    my($dbh) = DBI->connect(TREIBER,user,passwd); #
    $dbh->{PrintError} = 1; # PrintError legt fest ob die Fehler automatisch ausgegeben werden sollen oder nicht (schreibt auf STDERR)
                                     # will man das nicht (IIS oder so) einfach auf 0 setzen und weg ist die meldung (default = 1)

    $dbh->{RaiseError} = 1; # RaiseError legt fest, ob ein Fehler eine Exception ausloest oder nicht,
                                      # was bedeutet, dass das programm bei Fehlern stirbt (default = 1), sollte man so lassen

    Setzt man eval() ein, so kann man Fehler recht gut abfangen
    Beispiel:

    eval
    {
    my($dbh) = DBI->connect(TREIBER,user,passwd);
    $dbh->{PrintError} = 0;
    $sth = $dbh->prepare($mysqlstatement);
    $sth->execute();
    my($href);
    while($href = $sth->fetchrow_arrayref())
      {
                               #mach was draus
      }
    $sth->finish;
    };
    if($@)
    {

    warn "<!-- $mysql  
    Error:$@  
    // -->"; #meldung fuer den admin  
    

    print "nix geht mit datenbankabfrage!"; #meldung fuer den benutzer
    }

    Das funktionier bei mir eigentlich recht gut.
    btw.: wenn Du staendig die verbindung zum server verlierst, solltest Du Dich, glaub ich, mal mit dem Problem herumschlagen. ist ja nicht normal, nicht mal fuer oracle.
    bis auf ein massives sicherheitsproblem (cookie mit datenbank-passwort im klartext) ist das in der DBD::Oracle-manpage beschriebene oracletool.pl ein guter fundus fuer ideen.