# PHP 5 Exception Handling



## Quadaptor (12. Februar 2004)

Hallo,

seit ein paar Tagen beschäftige ich mich mit der 3. Beta Version von PHP 5.

Es hieß ja u.a. auch, dass das Exception Handling wie in Java geben sollen. Leider kommt mir es so vor, als werfen die PHP-Funktionen keine internen Exception?!

Z.b. bringt folgender Code nur einen typischen PHP-Fehler (failed to open stream: No such file or directory in ...):


```
try {
    include("datei.php");
} catch (exception $e) {
    echo $e->getMessage();
}
```

In Java würde an dieser Stelle z.B. eine FileNotFoundException geworfen werden.

Sehe ich das richtig oder gibt es eine Möglichkeit interne Exception abzufangen, etc.?!

Natürlich gibt es die Möglichkeit per If-Clausel "throw Exception" aufzurufen, was meiner Meinung nach allerdings nicht sehr viel bringt. So könnte ich theoretisch auch nur mit if() und else() arbeiten.

Gruß,
Dennis


----------



## mowl (12. Februar 2004)

```
<?php
try { 
    throw include("datei.php"); 
} catch (exception $e) { 
    echo $e->getMessage(); 
}
?>
```



> In Java würde an dieser Stelle z.B. eine FileNotFoundException geworfen werden.


Die Klasse "exception" muss vorhanden sein um einen Fehler auszugeben.

Unter php.net ist alles wunderbar erklärt : http://www.php.net/zend-engine-2.php


----------



## Quadaptor (12. Februar 2004)

Danke für die schnelle Antwort, aber ich glaube du hast mich falsch verstanden:

Ich möchte keine eigenen Exceptions schreiben und somit ist auch exception() im Code-Bespiel nicht vorhanden.  In Java muss man ja z.B. auch keine NullPointerException, etc. selber schreiben.

Es geht eigentlich darum, ob PHP-Funktionen eigene Exception werfen können!

Dennis


----------



## mowl (12. Februar 2004)

Nein geht nicht, des weiteren solltest du beachten das PHP kein Java ist und auch nicht werden wird!


----------



## Unksi (31. Oktober 2009)

Ich poste in den alten thread weil man ihn bei google unter "php error handling" weit oben findet.

Exception ist eine Klasse die im PHP Core ist, also kann man die auch benutzen, nur triggered include/require keine Exception sondern einen Error. Dh kann man den Fehler nur mit set_error_handler(function ($code,$str,$file,$line,$context){ //handle error }); einfangen, nicht mit try/catch.
Andere Möglichkeit wäre if((include "datei.php") != "OK") echo "Error loading file 'datei.php'"; .

Generell funktioniert das Error Handling in PHP >5 sehr gut, wenn man die bereitgestellen Klassen und Funktionen richtig nützt, trotzdem ist ein eigener Error & Exception Handler schnell angebracht um immer sauber formatierte Fehlermeldungen für den Benutzer zu gewähleisten.

Hierzu:
http://www.php.net/manual/en/ref.errorfunc.php
http://www.php.net/manual/en/class.exception.php

Die Exceptionklasse stellt viele der errorfunctions als Methoden bereit:


```
try {
$dblink = new PDO("mysql:host='host';dbname='db'",$user,$pass,array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_WARNING));
}
catch(Exception $err) {
echo $err->getTrace(); // Backtrace, das selbe wie debug_backtrace();
echo $err->getMessage(); // Fehlermeldung
echo $err->getCode(); // Fehlercode
echo $err->getFile(); // Datei in welcher der Fehler auftrat
echo $err->getLine(); // Zeile...
}
```

Vielleicht hilfts ja nochmal wem, konnt den mist von mowl da nur nicht so stehen lassen.


----------



## Flex (31. Oktober 2009)

Unksi hat gesagt.:


> Andere Möglichkeit wäre if((include "datei.php") != "OK") echo "Error loading file 'datei.php'"; .



Kleine Ergänzung zu dieser Variante:
Zu diesem Beispiel gehört natürlich dazu, dass man das [phpf]error_reporting[/phpf] auf 0 stellt, damit PHPs Fehlermeldungen auch unterdrückt. Dies sollte eigentlich auf jedem Produktivsystem so sein, aber ich dachte ich erwähn es nochmal 

Dringend sollte man die Benutzung des @ Operator vermeiden. Dieser unterdrückt zwar die Fehlermeldung, aber macht auch das Finden von Fehlern sehr schwer... Im obigen Beispiel ist es eine Funktion deren Parameter man kurz ändern, im anderen Fall sind es mal eben 200 @-Zeichen die man entfernen muss um den Fehler zu finden...


----------

