[PHP]nette errorafhandeling

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Dr_Frickin_Evil
  • Registratie: Mei 2000
  • Laatst online: 19-09 20:42
Ik ben bezig met een (voor mijn doen) behoorlijk groot opgezette website. Uiteindelijk zal die door best wat mensen gebruikt worden, grotendeels computerLeek (let op de hoofdletter). Natuurlijk kan er altijd wel wat mis gaan in je code, en om die mensen niet teveel te laten schrikken wil ik ze dan een duidelijke en nette foutmelding laten zien.

Op mijn site include ik de verschillende files die bij de menuonderdelen horen. Die staan allemaal in een array, index.php?section=news laat bij file news.php includen. Nu heb ik eenvolgende error-handler functie geschreven:

code:
1
2
3
4
5
function errorHandler($errno, $errstr, $errfile, $errline)  {
    echo "\n<p>Fout op regel $errline in $errfile: \"$errstr\"</p>";
    echo "\nNette melding blablabla";
    exit();
    }

Korte functie, maar hij voldoet. Nu heb ik dan wel hetvolgende probleem: stel dat de PHP-parser halverwege de geinclude pagina een fout tegenkomt, dan laat ie de al geparse-te zooi al wel zien. Wat ik wil, is dat ie in dat geval de eerdere output niet laat zien, en je alleen de foutmelding laat zien. Ik had dit eerst opgelost met een header-redirect, maar dat werkt eigenlijk toch niet erg handig, grotendeels omdat je dan niet goed weet waar de fout zit (in welke file en welke regel). Hoe doe ik dit op een nette manier?

Acties:
  • 0 Henk 'm!

  • Pathogen
  • Registratie: April 2004
  • Laatst online: 15-09 10:06

Pathogen

Shoop Da Whoop

sja dan zou je eerst de code moeten doorlopen voordat je gaat parsen, dan de errors afhandelen en dan parsen!

btw ik weet absoluut niet op welke manier je dat moet doen maar goed, 't is een ideetje

Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Je kan ook output buffering gebruiken. :) Daarnaast inderdaad eventueel een header sturen op het moment dat er iets fout gaat. En uiteraard de error_handler functie registreren voor je alle andere dingen gaat doen. :)

Sundown Circus


Acties:
  • 0 Henk 'm!

Verwijderd

Buffering gebruiken volgens mij.

http://nl2.php.net/manual/en/function.ob-start.php

Heb je iets aan leesvoer.

Wanneer er een fout optreed drop je alle gegenereerde output en laat je de error zien. Anders toon je aan het eind de hele pagina.

Acties:
  • 0 Henk 'm!

  • Pathogen
  • Registratie: April 2004
  • Laatst online: 15-09 10:06

Pathogen

Shoop Da Whoop

hey dat wist ik nog niet!
leer ik er ook nog wat van ;)

Acties:
  • 0 Henk 'm!

  • Dr_Frickin_Evil
  • Registratie: Mei 2000
  • Laatst online: 19-09 20:42
Die output buffering die gebruik ik al. Die wordt steeds door index.php al gestart.
Probleem is nu echter, dat de geinclude file steeds slechts een deel van de totale pagina is, maw zogauw ik die output drop, dan wordt mn pagina niet afgemaakt. Ik zou willen dat de output alleen per geinclude file gedropped wordt. Kan dat?

Acties:
  • 0 Henk 'm!

Verwijderd

Het is me nu niet meer helemaal duidelijk wat je exact wilt. Het lijkt mij het netst om alleen een foutmelding te zien en verder niets op de pagina.

zo dus.
- Output bufferen (gebeurt in index.php dus voor elke hit)
- Indien er een error komt de gebufferde output verwijderen (kan je in je error handler doen)
- Error bericht tonen
- exit() (hierdoor wordt het verwerken van php gestopt, geen verdere pagina onder je foutmelding dus)

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Dr_Frickin_Evil schreef op 28 mei 2004 @ 12:25:
Die output buffering die gebruik ik al. Die wordt steeds door index.php al gestart.
Probleem is nu echter, dat de geinclude file steeds slechts een deel van de totale pagina is, maw zogauw ik die output drop, dan wordt mn pagina niet afgemaakt. Ik zou willen dat de output alleen per geinclude file gedropped wordt. Kan dat?
Al vraag ik me af wat je precies bedoelt, wat je vraagt kan. Je kunt meerdere output-buffers starten/outputten/clearen/etc.

Als je echter al 1 globale outputbuffer gebruikt voor je hele pagina dan kun je dit toch bij een error stoppen? Ongeacht de include?

Een include is niet meer dan wat het zegt.. een stukje PHP code dat toevallig in een los bestand staat... Het geheel is nog steeds een hele lange lap code die geparst wordt.

[ Voor 22% gewijzigd door Bosmonster op 28-05-2004 13:44 ]


Acties:
  • 0 Henk 'm!

  • Dr_Frickin_Evil
  • Registratie: Mei 2000
  • Laatst online: 19-09 20:42
FF ter verduidelijking:
Ik heb een file index.php. Deze file include verschillende files, bijvoorbeeld news.php. Wat ik nu wil, is dat als er een fout in news.php voorkomt, dat dan van news.php alléén de foutmelding wordt geinclude. Kan dat uberhaupt?

Oke, dat bedoel ik dus. Het is dus de bedoeling dat, voordat ik de files include, ff een nieuwe outputbuffer start? FF zoeken hoe dat allemaal precies werkt.

[ Voor 25% gewijzigd door Dr_Frickin_Evil op 28-05-2004 13:55 ]


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

Tsja, daar komt dus het werken met templates weer mooi uit de bus :)

Ik werk zelf ongeveer het volgende:

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
44
45
46
47
48
49
50
51
52
53
54
55
// handelt de eigenlijke error af
function myError($errno, $errstr, $errfile, $errline)
{
        global $_TPL;
        $errorarray = Array(
        1 => "Error",
        2 => "Warning",
        4 => "Parse Error",
        8 => "Notice",
        16 => "Core Error",
        32 => "Core Warning",
        64 => "Compile Error",
        125 => "Compile Warning",
        256 => "User Error",
        512 => "User Warning",
        1024 => "User Notice");
        $errstr = str_replace("\r", "", str_replace("\n", "", nl2br($errstr)));
        if ($errno != 8)
        {
                if (array_key_exists($errno, $errorarray)) { $errno = $errorarray[$errno]; }
                $_TPL['error'][] = Array($errno, $errstr, $errfile, $errline);
        }
}

// voor debug variabelen naar de popup
function throw_error($input)
{
        global $_TPL;
        $array = debug_backtrace();
        $errno = "Debug information:";
        $errstr = str_replace("\r", "", str_replace("\n", "", nl2br(addslashes(printarray($input)))));
        $_TPL['error'][] = Array($errno, $errstr, $array[0]['file'], $array[0]['line']);
}

// in m'n template.inc.php

if (is_array($_TPL['error']))
{
    echo ('<script language="javascript">
    var windowHTML = " ";
    ErrorWindow = window.open("","ErrorWindow","width=500,height=480,scrollbars=1,resizable=yes");
    ErrorWindow.document.write("<html><title>Foutmeldingen</title><body style=\'background:#f0f0f0; font:11px verdana\'></body></html>");
    ErrorWindow.document.body.innerHTML = "";');
    for ($i = 0; $i< sizeof($_TPL['error']); $i++)
    {
        if (is_array($_TPL['error'][$i][0]))
        {
            $_TPL['error'][$i][0] = printarray($_TPL['error'][$i][0]);
        }
        echo( "\n".'windowHTML += "<div style=\'padding:3px; border-bottom:1px solid black\'><b style=\'color:red\'>Error: </b> '.$_TPL['error'][$i][0]."<br><b>Error Msg:</b> ".$_TPL['error'][$i][1].'<br><b>On Line:</b> '.$_TPL['error'][$i][3].' of '.$_TPL['error'][$i][2].'</div>";');
    }

    echo("
    ErrorWindow.document.body.innerHTML += windowHTML;
    </script>");

Dit kan je nog zo gek uitbreiden als je wilt, ik heb hier ook al eenv ersie die een complete stack trace in de popup pleurt :P

[ Voor 19% gewijzigd door SchizoDuckie op 28-05-2004 14:19 . Reden: sorry voor de layout verneukerij, hope this helps someone :) ]

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • Dr_Frickin_Evil
  • Registratie: Mei 2000
  • Laatst online: 19-09 20:42
De tip van Bosmonster deed het hem. Ik heb het nu zo gedaan:
index.php:
code:
1
2
3
4
5
6
7
8
9
10
11
ob_start();

//Opbouw site enz

ob_start();
include($include[0]); // Include selected section
ob_end_flush();

//Opbouw site enz

ob_end_flush();

de error-handler:
code:
1
2
3
4
5
6
function errorHandler($errno, $errstr, $errfile, $errline)  {
    ob_clean();
    echo "\n<p>Fout op regel $errline in $errfile: \"$errstr\"</p>";
    echo "\nNette melding blablabla";
    exit();
    }

Helaas lijkt de error-handler niet te werken voor parse-errors (; vergeten ofzo). Dan krijg ik weer een standaard PHP-melding. Weet iemand wat ik daar aan kan doen?

[ Voor 12% gewijzigd door Dr_Frickin_Evil op 28-05-2004 15:32 ]


Acties:
  • 0 Henk 'm!

  • yiko
  • Registratie: September 2003
  • Laatst online: 20-04 20:19

Acties:
  • 0 Henk 'm!

  • dingstje
  • Registratie: Augustus 2002
  • Laatst online: 02-01-2024
Moest je ernaar zoeken op PHP.net zou je deze pagina vinden: http://www.php.net/manual/nl/ref.errorfunc.php. Daarmee kan je de standaard PHP error handler aanpassen (en een gewone string 'Fout opgetreden' schrijven naar het scherm en de eigenlijke fout loggen in een bestand, ook bij parse errors)

If you can't beat them, try harder

Pagina: 1