You are not logged in.

  • Login

1

Monday, May 23rd 2011, 12:22pm

error_handler in custom Exception "umbiegen"

Hallo zusammen.

Ich schlage mich zur Zeit mit einem OOP Problem bei PHP 5.3 rum.
Mein Ziel ist es, für eine komplexe Anwendung, den PHP Standard Error Handler in eine eigene Exception Klasse um zu biegen.
Den dafür nötigen Code habe ich auf php.net bereits gefunden.
Allerdings scheint hier etwas nicht zu stimmen, da der PHP Kompiler einen Fatal Error auswirft.

Hier mal der Code für den Error Handler und die Custom Exceptions:

PHP Quellcode

1
2
3
4
5
6
7
8
// wandelt PHP eigene Fehlermeldungen in Exceptions der Klasse ErrorException um
set_error_handler(create_function('$a, $b, $c, $d', 'throw new CoreException($b, 0, $a, $c, $d);'), E_ALL);
 
// Benutzerdefinierte Exceptions
class DBException		extends Exception { }
class CoreException		extends Exception { }
class MoecoException	extends Exception { }
class PortalException	extends Exception { }


Hier die entsprechende Fehlermeldung aus dem Event Log vom ZendServer:

PHP Quellcode

1
2
3
4
5
Wrong parameters for Exception([string $exception [, long $code [, Exception $previous = NULL]]])
 
__lambda_func() at /var/www/moecoportal/core/CustomExceptions.php(4) : runtime-created function : 1 Show File
__lambda_func()
main() at /var/www/moecoportal/core/CoreInit.php : 6 Show File


Ich habe schon alles mögliche versucht um die Sache mit den falschen Parametern in den Griff zu bekommen, aber bisher hat nichts geholfen.
Vielleicht sieht hier ja jmd. direkt das Problem / den Fehler!

Grüße,
GhostScripter

2

Monday, May 23rd 2011, 6:14pm

Hi,

deine CoreExceeption nimmt zu viele Parameter entgegen.

PHP Quellcode

1
public Exception::__construct() ([ string $message = "" [, int $code = 0 [, Exception $previous = NULL ]]] )


Der Konstruktor erwartet höchstens 3 Parameter.


da du deine Variablen mit a,b,c,d benennst kann ich nur raten (nutze lieber aussagekräftige Namen)

PHP Quellcode

1
set_error_handler(create_function('$a, $b, $c, $d', 'throw new CoreException($b, 0);'), E_ALL);


oder (die meiner Meinung nach übersichtlichere Schreibweise)

PHP Quellcode

1
set_error_handler(function($a, $b, $c, $d) {throw new CoreException($b, 0);}), E_ALL);

3

Tuesday, May 24th 2011, 8:15am

Hi vince,

vielen Dank für Deine Antwort.
Leider war ich auch schon so weit (aufgrund der Fehlermeldung), das die Parameterzahl nicht stimmt.

Ich habe mir das Konstrukt noch einmal angesehen und festgestellt, das in dem Beispiel das ganze auf eine ErrorException umgebogen wird.

Normalerweise sind meine Variablen mit sprechenden Bezeichnern versehen, bei diesem Fall habe ich aber lediglich die Bezeichnungen aus dem Beispiel von php.net übernommen.

Nachdem ich das ganze jetzt auf die PHP eigene ErrorException umgebogen habe scheint das Parameterproblem behoben zu sein.
Allerdings werden keine Exceptions geworfen, wenn PHP Fehlermeldungen auftreten...

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
try {
	require_once('CoreConfig.cfg.php');
 
        // for Init Debug only
	$definedConstants = get_defined_constants(true);
	echo '<pre>';
	print_r($definedConstants['user']);
	echo '</pre>';
        // ##############
 
} catch (ErrorException $ee) {
	$ee->getMessage();
}


Wenn ich nun den Namen der einzubindenden Datei auf eine nicht existierende ändere, so wird keine Exception geworfen.
Ich erhalte lediglich folgende Meldungen:

Source code

1
2
3
Fatal PHP Error
main() [function.require]: Failed opening required 'CoreConfig.scfg.php' (include_path='.:/usr/local/zend/share/ZendFramework/library:/usr/local/zend/share/pear')
Error Type:	E_COMPILE_ERROR


Wenn ich das mit dem ErrorHandler und der Exception richtig verstanden habe, dann müssten aber doch alle PHP eigenen Fehlermeldungen als ErrorException geworfen werden?!

4

Tuesday, May 24th 2011, 10:43am

Hi,

Ich habe mir das Konstrukt noch einmal angesehen und festgestellt, das in dem Beispiel das ganze auf eine ErrorException umgebogen wird.

ah Ok.


Wenn ich das mit dem ErrorHandler und der Exception richtig verstanden habe, dann müssten aber doch alle PHP eigenen Fehlermeldungen als ErrorException geworfen werden?!

Ne, leider nicht.

Quoted

Die folgenden Fehlertypen können nicht von einer benutzerdefinierten Funktion behandelt werden: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING und die meisten E_STRICT, die in der Datei ausgelöst werden, in der set_error_handler() aufgerufen wird.
Quelle: http://de2.php.net/manual/de/function.set-error-handler.php

5

Wednesday, May 25th 2011, 9:55am

Hi vince,

vielen Dank für die Antwort.
Das ist das alte Problem mit dem genauen lesen :-(

Habe zwar im Netz was gefunden, wie man sich mit ob_start(), ob_get_contents() und ob_end_flush() einen eigenen "Error Handler" für alle "nicht Exception Fehler" bauen kann. Aber solchen Krücken gegenüber bin ich vorsichtig!

Wie gesagt, danke für die Hilfe, ich close das dann hier mal!

Grüße,
GhostScripter

6

Wednesday, May 25th 2011, 7:23pm

hi,

der Artikel hat schon bei einigen einen verfrühten Euphorie-Effekt ausgelöst, da man denkt, dass man alle Fehler mit Hilfe von Exceptions fangen kann ..... aaaaber man ganz schnell set_error_handler übersieht.
Wohl auch, da dies nicht, wie von anderen Artikeln gewohnt, gleich unten verlinkt ist.

Similar threads

Social bookmarks