Ankündigung

Einklappen
Keine Ankündigung bisher.

Fehlerhandling / Exceptions

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Fehlerhandling / Exceptions

    Guten Morgen zusammen!

    Beim Einlesen in das Thema TRANSACTION bin ich immer wieder über Exceptions gestolpert und hab mich auch damit ein wenig auseinander gesetzt. Darüber wird ja auch hier im Forum viel diskutiert. Ganz oft werden Exceptions im Zusammenhang mit "Fehlern bei der Datenbankverbindung" genannt. Nun zu meiner Frage, ich überprüfe meine Verbindung zur Datenbank auf diese Weise und fange so den Fehler ab...
    PHP-Code:
    $verbindung mysqli_connect("","root","root","test");

    if (!
    $verbindung) {
        
    //Mail an Programmierer
        
    $to="erport@test.de";
        
    $subject="Fehler beim Verbinden zur Datenbank";
        
    $message="Beim Verbinden zur Datenbank sind folgende Fehler aufgetreten: "mysqli_connect_error() . mysqli_connect_errno();
        
    sendmail($to$subject$message); 
    Nun würde mich interessieren, ob eurer Meinung nach das so als Fehlerhandling reicht oder ob hier der Weg über Exceptions gegangen werden sollte? Falls ja, warum? Worin liegt der Unterschied?

    Ich danke Euch!!

  • #2
    Für eine einfache Lösung ist das oben erstmal ausreichend.
    Exceptions werden dort wichtig wo Quelltext mehrfach Verwendet wird und evtl. von unterschiedlichen Leuten benutzt wird, bzw. man Funktionen und Klassen anderen zur Verfügung stellt. Zudem kann damit Fehlerbehandlung an einer Stelle bündeln (also auch nur für einen selber ist eine gutes Vorgehen.)

    Um mal ein einfaches Beispiel zu bringen. Packen wir deinen Connect in eine Funktion.

    PHP-Code:
    function connectToDB($host,$user,$password,$db,$to) {

            
    $verbindung mysqli_connect($host,$user,$password,$db); 

            if (!
    $verbindung) { 
                
    //Mail an Programmierer 
                
    $to="erport@test.de"
                
    $subject="Fehler beim Verbinden zur Datenbank"
                
    $message="Beim Verbinden zur Datenbank sind folgende Fehler aufgetreten: "mysqli_connect_error() . mysqli_connect_errno(); 
                
    sendmail($to$subject$message); 
            }
        } 
    Die Problem damit ist jetzt:
    Die Funktion sendet immer eine Mail im Fehlerfall, wer sagt das man das immer möchte?
    Ich muss den Empfänger zusätzlich übergeben der mit der eigentlichen Funktion nichts zutun hat.
    Mit der Funktion ist bis jetzt erstmal nur die Behandlung des Fehlers für den Programmier abgedeckt.

    Bringen wir eine Exception ins Spiel:
    PHP-Code:
    function connectToDB($host,$user,$password,$db) {
            
    $verbindung mysqli_connect($host,$user,$password,$db); 

            if (!
    $verbindung) { 
                
    $message="Beim Verbinden zur Datenbank sind folgende Fehler aufgetreten: "mysqli_connect_error() . mysqli_connect_errno(); 
                throw new 
    Exception($message);
            }
        }
        
        try {
            
    connectToDB($host,$user,$password,$db);
            
    doOtherStuff();
        }
        catch(
    Exception $e) {
            
    sendmail($to'error'$e->getMessage()); 
        } 
    Die Funktion selber wirft jetzt im Fehlerfall eine Exception.
    Diese kann ich außerhalb abfangen. An der gleichen Stelle kann ich auch noch Fehler von der Funktion doOtherStuff(); auffangen.
    Sprich nicht mehr die Funktion entscheidet wie mit dem Fehler umgegangen wird sondern der Programmierer der diese nutzt.

    Das ist jetzt nur ein ganz einfaches Beispiel. Und vieles reiße ich nur an.
    Es lohnt sicher aber mit dem Thema genauer zu beschäftigen, besonderes im Zusammenhang Object orientierter Programmierung.
    Vieles kann, wenig muss.

    Kommentar


    • #3
      @varon vielen lieben Dank, das ist mal verständlich. Wirklich toll!

      Jetzt gibt es noch ein paar kleine Dinge, die mich in diesem Zusammenhang interessieren würden.

      An der gleichen Stelle kann ich auch noch Fehler von der Funktion doOtherStuff(); auffangen.
      Fang ich nicht mit dem catch-Teil?

      Und ich hoffe, ich breche jetzt Grundsatzdiskussion vom Zaun, aber wo setze ich dann die Exceptions ein. Im Netz liest man oft, überall wo eigentlich kein Fehler auftreten sollte/kann. Aber dann kann ich ja theoretisch überall nen try-Block setzen, oder versteh ich da was falsch?

      Danke nochmal!

      Kommentar


      • #4
        Hallo michiman,

        gemeint ist: Alle Exception die im Try-Block passieren können im Catch aufgefangen werden.
        Der Satz bezog sich darauf das connectToDB() klappt aber doOtherStuff(); eine Exception wirdt.

        Zum anderen Punkt: im einfachen Fall reicht ein try-catch Block ums ganze Programm.
        Wenn Anwendungen umfangreicher werden kann es durch aus sein das man mehrere hat die evtl. auch selber noch mal Exception werfen.
        Um hier auch einfach zu bleiben: Sagen wir ich hab einen Newsblock auf meiner Seite und eine Übersicht welche User grade Online sind. Wenn nun eins der Module nicht funktioniert möchte ich ja dennoch, dass das andere weiterhin kommt. Während wenn der DB Connect nicht klappt beides evtl. gleich weg fällt.
        Vieles kann, wenig muss.

        Kommentar


        • #5
          Kleiner Tipp... du willst definitv KEINE Mail haben wenn EIN Verbindungsaufbau zur Datenbank fehlschlägt! Das führt nur zu einem vollen Postfach.

          Kommentar


          • #6
            @erc kommt das so oft vor???

            @varon besten Dank, das hilft auf jeden Fall schon mal weiter.

            Kommentar

            Lädt...
            X