set error handler()
set_error_handler
(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)
- set_error_handler — Ställer in en användardefinierad felhanteringsfunktion
Beskrivning
set_error_handler(?callable $callback, int $error_levels = E_ALL): ?callable
Definierar en användarfunktion (callback) för att hantera fel i ett skript.
Denna funktion kan användas för att skapa anpassade felhanterare vid körning, till exempel i applikationer som behöver städa upp filer/data vid kritiska fel eller vid utlöst fel under vissa förhållanden (använder trigger_error()).
Standard PHP-felhanteraren ignoreras helt för de feltyper som anges i error_levels om inte callback-funktionen returnerar false. Inställningarna för error_reporting() påverkar inte och felhanteraren kommer att kallas oavsett – men det är fortfarande möjligt att läsa aktuellt värde av error_reporting och agera därefter.
Observera att det är handlerns ansvar att stoppa skriptets körning vid behov genom att kalla exit(). Om felhanteraren returnerar, kommer skriptet fortsätta med nästa instruktion efter det som orsakade felet.
Vissa feltyper kan inte hanteras med en användardefinierad funktion: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING oberoende av var de inträffade, och större delen av E_STRICT som genereras i den fil där set_error_handler() anropas.
Om fel inträffar innan skriptet körs (t.ex. vid filuppladdning) kan inte den anpassade felhanteraren anropas eftersom den ännu inte har registrerats.
Parametrar
callback Om null anges, återställs hanteraren till sitt standardläge. Annars är hanteraren en callback med följande signatur:
handler( int $errno, string $errstr, string $errfile = ?, int $errline = ?, array $errcontext = ? ): bool
- errno – Första parametern, errno, får feltypen som orsakade felet som en heltal.
- errstr – Andra parametern, errstr, innehåller felmeddelandet som en sträng.
- errfile – Tredje parametern, om callback accepterar det, innehåller filnamnet där felet inträffade som en sträng.
- errline – Fjärde parametern, om callback accepterar det, innehåller radnummer där felet inträffade som ett heltal.
- errcontext – Femte parametern, om callback accepterar det, innehåller en array med alla variabler som fanns i den kontext där felet utlösts. Användardefinierade felhanterare får inte ändra detta felkontext.
error_levels Kan användas för att maskera utlösningen av callback-funktionen likt error_reporting-inställningen styr vilka fel som visas. Utan denna maskering kommer callback att anropas för alla fel oavsett inställning av error_reporting.
Returvärden
Returnerar den tidigare definierade felhanteraren (om det finns någon). Om den inbyggda felhanteraren används returneras null. Om den tidigare felhanteraren var en klassmetod returneras en indexerad array med klassen och metodnamnet.
Exempel
- Exempel #1 Felhantering med set_error_handler() och trigger_error()
Exemplet nedan visar hantering av interna undantag genom att utlösa fel och hantera dem med en användardefinierad funktion:
<?php
// Felhanterarfunktion
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
if (!(error_reporting() & $errno)) {
return false;
}
$errstr = htmlspecialchars($errstr);
switch ($errno) {
case E_USER_ERROR:
echo "<b>Mitt FEL</b> [$errno] $errstr<br />\n";
echo " Allvarligt fel på rad $errline i fil $errfile";
echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
echo "Avbryter...<br />\n";
exit(1);
case E_USER_WARNING:
echo "<b>Min VARNING</b> [$errno] $errstr<br />\n";
break;
case E_USER_NOTICE:
echo "<b>Min NOTIS</b> [$errno] $errstr<br />\n";
break;
default:
echo "Okänd feltyp: [$errno] $errstr<br />\n";
break;
}
return true;
}
// Funktion för att testa felhantering
function scale_by_log($vect, $scale)
{
if (!is_numeric($scale) || $scale <= 0) {
trigger_error("log(x) för x <= 0 är odefinierad, du angav: scale = $scale", E_USER_ERROR);
}
if (!is_array($vect)) {
trigger_error("Felaktig indata-vektor, array förväntad", E_USER_WARNING);
return null;
}
$temp = array();
foreach($vect as $pos => $value) {
if (!is_numeric($value)) {
trigger_error("Värde på position $pos är inte ett nummer, använder 0 (noll)", E_USER_NOTICE);
$value = 0;
}
$temp[$pos] = log($scale) * $value;
}
return $temp;
}
// Ställ in till den användardefinierade felhanteraren
$old_error_handler = set_error_handler("myErrorHandler");
// Utlösa några fel
echo "vektor a\n";
$a = array(2, 3, "foo", 5.5, 43.3, 21.11);
print_r($a);
// Generera andra array
echo "----\nvektor b - en notis (b = log(PI) * a)\n";
$b = scale_by_log($a, M_PI);
print_r($b);
// Detta är problematiskt, vi skickar en sträng istället för en array
echo "----\nvektor c - en varning\n";
$c = scale_by_log("not array", 2.3);
var_dump($c); // NULL
// Detta är ett kritiskt fel
echo "----\nvektor d - allvarligt fel\n";
$d = scale_by_log($a, -2.5);
var_dump($d); // Aldrig nått
?>
Denna kod kommer att generera följande utmatning:
vektor a Array ( [0] => 2 [1] => 3 [2] => foo [3] => 5.5 [4] => 43.3 [5] => 21.11 ) ---- vektor b - en notis (b = log(PI) * a) <b>Min NOTIS</b> [1024] Värde på position 2 är inte ett nummer, använder 0 (noll)<br /> Array ( [0] => 2.2894597716988 [1] => 3.4341896575482 [2] => 0 [3] => 6.2960143721717 [4] => 49.566804057279 [5] => 24.165247890281 ) ---- vektor c - en varning <b>Min VARNING</b> [512] Felaktig indata-vektor, array förväntad<br /> NULL ---- vektor d - allvarligt fel <b>Mitt FEL</b> [256] log(x) för x <= 0 är odefinierad, du angav: scale = -2.5<br /> Allvarligt fel på rad 35 i fil trigger_error.php, PHP 5.2.1 (FreeBSD)<br /> Avbryter...<br />
Se även
- ErrorException
- error_reporting() - Anger vilka PHP-fel som rapporteras
- restore_error_handler() - Återställer den tidigare felhanteraren
- trigger_error() - Genererar ett användarnivåfel/varning/meddelande
- Felkonstanter
Sidslut
Orginalhemsidan på Engelska :https://www.php.net/manual/en/function.set-error-handler.php
PHP Funktioner Funktionsreferens
Det här är en maskinöversättning av PHP-manualen till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på
https://www.linux.se/kontaka-linux-se/
Tack till Datorhjälp Stockholm som har sponsrat Linux.se med webserver.