Exception vs. trigger_error

Parantatatam

mag Cookies & Kekse
Hallo,

ich benutze aktuell in meinen Klassen überall, wo Fehler auftreten könnten, die Funktion trigger_error(). Da gibt es dann teilweise Fehler, die an dieser Stelle noch korrigiert werden können (wieder auf Standard-Wert zurück), aber es gibt eben auch welche, wo ich dann die ganze Methode abbreche, weil dieser Fehler sich auf das ganze Skript fehlerhaft auswirken würde. Nun zu meiner Frage: inwieweit ist es sinnvoll das durch Exceptions zu ersetzen? Ich habe bisher noch nie mit Exceptions gearbeitet, aber da die ja direkt für die Ausnahmebehandlung zuständig sind dachte ich mir, dass ich mich vielleicht darauf umgewöhnen sollte. Was ist eure Meinung dazu?
 
Zuletzt bearbeitet:
Ja, es ist absolut sinnvoll, Exceptions zu verwenden, wenn du ohnehin schon Klassen verwendest.

Du kannst die Basis-Klasse Exception erweitern, was bspw so aussehen könnte:

PHP:
class MyException extends Exception
{
}

class MyExtendedException extends Exception
{
}

Nun hast du eventuell eine Klasse a mit der Methode b, welche zwei mögliche Fehlerquellen hat. Die erste ist nicht unbedingt so schwerwiegend um die weitere Verarbeitung abzubrechen, die zweite schon:

PHP:
class a
{
  public function b()
  {
     if($x == null)
     {
        throw new MyException("Nicht so schlimm!");
     }
     if($y == null)
     {
        throw new MyExtendedException("Katastrophe!");
     }
  }
}

$a = new a();

try
{
   $a->b();
}
catch(MyException $ex)
{
   echo $ex->getMessage();
}
catch(MyExtendedException $ex)
{
  echo $ex->getTraceAsString();
  die($ex->getMessage());
}

Wie du siehst, wird die erste Meldung nur ausgegeben. Nach dem Try-Catch-Block würde dann weiter gearbeitet.
Bei der zweiten Exception würde das Script sofort beendet nach dem der Strack-Trace ausgegeben wurde.

Es ist sehr viel sinnvoller mit Exceptions zu arbeiten. Mit trigger_error in Klassen zu arbeiten ist wie von hinten durch die Brust ins Auge treffen zu wollen. ;-)
 
Gibt es da auch eine Möglichkeit die per function __autoload($class) zu laden?

// EDIT: Wenn ich jetzt zweimal hintereinander (jetzt mal als Beispiel) MyException verwenden will, muss ich dann vorher die Exception-Nachricht auffangen und dann zusammen mit der neuen wieder werfen?
 
Zuletzt bearbeitet:
Selbstverständlich funktioniert das. Es handelt sich bei Exception ja um eine Klasse.

//Edit:

Zur zweiten Frage: Ja, genauso müsste das laufen.
 
Danke euch beiden erstmal. Ich habe jetzt mal folgendes versucht:
PHP:
<?php
class iNotice extends Exception
 {
  function __toString()
   {
    return parent::getMessage();
   }
 }

class iFatal extends Exception
 {
  function __toString()
   {
    return parent::getMessage();
   }
 }

class iWarning extends Exception
 {
  function __toString()
   {
    return parent::getMessage();
   }
 }

class a
 {
  public function b($y = NULL )
   {
    $x = NULL;
    
    if($x === NULL)
     {
      throw new iNotice('Nicht so schlimm!');
     }
     
    if($y === NULL)
     {
      throw new iFatal('Katastrophe!');
     }
    
    echo 'mehr inhalt';
   }
 }

$a = new a();

try
 {
  $a->b();
 }
 catch(iNotice $ex)
 {
  echo $ex;
 }
 catch(iFatal $ex)
 {
  die($ex);
 }
?>

Wenn nun $x === NULL eintritt, dann wird ja echo 'mehr Inhalt' nicht mehr ausgeführt. Brechen in diesem Fall immer die Prozesse ab oder kann man das irgendwie so programmieren, dass zwar 'Nicht so schlimm!' ausgeworfen wird, aber der Prozess trotzdem weiterläuft wie normal? Oder ist das nicht der Sinn von Exceptions?
 
Hi, wenn eine Exception geworfen wird, wird immer zum nächsten try - catch gesprungen, es gibt also keine Möglichkeit, den weiteren Code direkt auszuführen. Du kannst allerdings die Exception erzeugen, und sie zu einem späteren Zeitpunkt werfen, also z.B. so:
PHP:
if($x === NULL)
{
  $e = new Exception('Notice');
}

// hier dann irgendwas machen, was trotzdem ausgeführt werden soll...

if(!empty($e))
{
  throw $e;
}
Ob das allerdings so sinnvoll ist, wage ich zu bezweifeln. Ich würde Exceptions nur dann verwenden, wenn der weitere Code nicht mehr ausgeführt werden soll. In deinem Beispiel würde ich keine Exceptions für iNotice und iWarning verwenden sondern hier mit trigger_error('', E_USER_NOTICE) bzw. trigger_error('', E_USER_WARNING) arbeiten, da es mehr Sinn macht.

Fazit: Exceptions sind eine tolle Sache, aber für Notices und Warnings sollte man sie nicht verwenden.
 
Zurück