[PHP] set_error_handler

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
PHP:
1
2
3
4
5
6
7
8
9
10
11
  require_once( dirname(__FILE__) . '/config.php' ); // $GLOBALS['main_directory'] is set...

    // disable timeouts... Because this report can run for like hours!!
    set_time_limit(0);

  // error-thingies...
    require_once( $GLOBALS['main_directory'] . '/global_functions.php' );

  error_reporting( E_ALL );
  set_error_handler('ErrorReporting');
  @ini_set('display_errors', '1');


Code deel 1: Hierin zet ik alle errors-output aan. (ErrorReporting is gedefinieerd in 'global_functions.php').

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
function ErrorReporting( $errno, $errstr, $errfile, $errline )
{
  if ( !isset($GLOBALS['error_file']) || !is_resource($GLOBALS['error_file']) )
  {
    $argc = $_SERVER['argc'];
    for ( $i = 0; $i < $_SERVER['argc']; $i++ )
    {
      if ( is_numeric($_SERVER['argv'][$i]) )
      {
        $GLOBALS['error_file'] = fopen( GiveErrorFile_Name( $_SERVER['argv'][$i], $_SERVER['argv'][$i+1], $_SERVER['argv'][$i+2] ), 'w' );
        break;
      }
    }
  }

  if ( $errno & FATAL )
  {
    $text = "FATAL  : " . $errstr . " [" . basename($errfile) . " ({$errline})]";
  }
  else if ( $errno & ERROR )
  {
    $text = "ERROR  : " . $errstr . " [" . basename($errfile) . " ({$errline})]";
  }
  else if ( $errno & WARNING )
  {
    $text = "WARNING: " . $errstr . " [" . basename($errfile) . " ({$errline})]";
  }
  else
  {
    $text = "Unkown error type: [$errno] " . $errstr . " [" . basename($errfile) . " ({$errline})]";
  }

  if ( isset($GLOBALS['error_file']) && is_resource($GLOBALS['error_file']) )
    fwrite( $GLOBALS['error_file'], $text . "\r\n" );
  else
    echo $text . "<br />\r\n";

  if ( $errno & FATAL )
  {
    echo "FATAL  : " . $errstr . " [" . basename($errfile) . " ({$errline})]";
    exit(1);
  }
}


Code deel 2: De error-handler...

code:
1
Fatal error: Call to undefined function:  pc4p_draw() in /usr/local/apache2/htdocs/new_reporting/include/pc4p_page.inc on line 446


Foutmelding:
Deze foutmelding krijg ik soms bij het uitvoeren van mijn script.
Nu is dit wel zeer raar, want normaal zou er moeten komen:
code:
1
FATAL  : Call to undefined function:  pc4p_draw() [pc4p_page.inc (446)]


Kan er iemand misschien iets zien dat ik gemist heb bij deze error-afhandeling?

Met dank!

Acties:
  • 0 Henk 'm!

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 04-09 08:16

OkkE

CSS influencer :+

Werkt je error-handler bij andere errors wel goed?

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Inderdaad, sorry voor dit niet te vermelden, maar voor de andere schrijft hij alles weg in de $GLOBALS['error_file']

Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 18:04
if ( $errno & FATAL )

niet alles nagekeken, maar weet je dat zeker? Niet && nodig daar? En heb je de constanten FATAL etc wel ergens ge-DEFINE-d

//Edit: k, beter naar moeten kijken idd. Weet dat het bitwise-operator is. Iets met haastige spoed en zelden goed enzo ;)

[ Voor 64% gewijzigd door Morrar op 13-12-2004 15:55 ]


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Morrar schreef op maandag 13 december 2004 @ 15:45:
if ( $errno & FATAL )

niet alles nagekeken, maar weet je dat zeker? Niet && nodig daar?
Nee, dat klopt gewoon hoor. Hij doet daar namelijk een bitwise comparison.

TS wat je wilt doen:

PHP:
1
if ( (int) $errno & (int) FATAL )


Even naar integers casten, dat wil nog weleens bokken.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dit is inderdaad een enkele '&'... Maw een bitwise '&' comparator ...
FATAL = E_USER_ERROR | E_ERROR enz...

Acties:
  • 0 Henk 'm!

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 04-09 08:16

OkkE

CSS influencer :+

Ik neem aan dat je wel elke keer dat die fout optreed je de normale error krijgt, ipv jou error-handler? Of krijg je met die specifieke error soms je eigen soms de standaard?

Ik zie iedergeval niet wat de oorzaak kan zijn..... :?

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
inderdaad, ik krijg de "foute" fout... Ik zou die via mijn errorhandler willen laten lopen (voor bvb een debug-backtrace te doen).

Ik ook niet :S

Acties:
  • 0 Henk 'm!

  • yiko
  • Registratie: September 2003
  • Laatst online: 20-04 20:19
Is het niet zo dat je fatal errors niet kunt opvangen ? Net zoals je parse errors niet kunt opvangen ?
Daar lijkt het hier toch op.

Acties:
  • 0 Henk 'm!

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 04-09 08:16

OkkE

CSS influencer :+

yiko schreef op maandag 13 december 2004 @ 16:53:
Is het niet zo dat je fatal errors niet kunt opvangen ? Net zoals je parse errors niet kunt opvangen ?
Daar lijkt het hier toch op.
Note: The following error types cannot be handled with a user defined function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and E_STRICT.

[ Voor 7% gewijzigd door OkkE op 13-12-2004 17:01 ]

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Acties:
  • 0 Henk 'm!

  • yiko
  • Registratie: September 2003
  • Laatst online: 20-04 20:19
Had het voor de zekerheid ook nog eens opgezocht. Het lijkt er toch op dat hier de default php errorhandler gebruikt wordt , ipv de custom errorhandler. Ik heb het zelf nog eens uitgetest (voorbeeld van php.net genomen) , en het werkt in ieder geval.
Ben je zeker dat je nergens de default errorhandler terug zet ( restore_error_handler ) ?

[ Voor 1% gewijzigd door yiko op 14-12-2004 07:18 . Reden: typo's ]


Acties:
  • 0 Henk 'm!

Verwijderd

Het is op zich raar dat PHP een soms error geeft dat een functie niet bestaat. Bestaat deze functie wel en is deze ook geinclude?

Acties:
  • 0 Henk 'm!

  • yiko
  • Registratie: September 2003
  • Laatst online: 20-04 20:19
Ik heb nog een beetje zitten testen, en het blijkt dat OkkE al het antwoord had gegeven.
De fout van "undefined function" heeft errortype E_ERROR, en dat is een error die je niet kunt opvangen.

Het enige dat je zou kunnen doen om zo'n fouten op te vangen, is het werken met outbut buffering, en op het einde van je script de output terug inlezen ( ob_get_contents ) en daarin dan zoeken naar het typische php formaat van errors. Je hebt dan wel geen callstack meer, maar je kan het dan wel eventueel loggen of een andere pagina tonen ipv de php error.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja, in de PC4P class doen ze "die()" met een errorboodschap.

Hier heb ik dus alle "die()"'s vervangen door trigger_error(...E_USER_ERROR...). Op deze manier zullen deze normaal moeten opgevangen worden.

Met dank voor de hints :)
Pagina: 1