CakeFest 2024: The Official CakePHP Conference

Esempi

Di seguito sarà illustrato un esempio di utilizzo delle procedure di gestione dell'errore in PHP. Qui si definisce una funzione di gestione dell'errore che registra le informazioni in un file (in formato XML) e invia tramite e-mail allo sviluppare dei messaggi in caso di errori critici nella logica.

Example #1 Esempio dell'utilizzo della gestione degli errori in uno script

<?php
// attiveremo la nostra gestione degli errori
error_reporting(0);

// funzione personalizzata di gestione dell'errore
function userErrorHandler($errno, $errmsg, $filename, $linenum, $vars)
{
// timestamp per la registrazione dell'errore
$dt = date("Y-m-d H:i:s (T)");

// definisce un array associativo con i messaggi di errore
// in realtà i soli campi che saranno
// considerati sono E_WARNING, E_NOTICE, E_USER_ERROR,
// E_USER_WARNING e E_USER_NOTICE
$errortype = array (
E_ERROR => 'Error',
E_WARNING => 'Warning',
E_PARSE => 'Parsing Error',
E_NOTICE => 'Notice',
E_CORE_ERROR => 'Core Error',
E_CORE_WARNING => 'Core Warning',
E_COMPILE_ERROR => 'Compile Error',
E_COMPILE_WARNING => 'Compile Warning',
E_USER_ERROR => 'User Error',
E_USER_WARNING => 'User Warning',
E_USER_NOTICE => 'User Notice',
E_STRICT => 'Runtime Notice',
E_RECOVERABLE_ERROR => 'Catchable Fatal Error'
);
// indica gli errori per i quali verrà salvata la trace delle variabili
$user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE);

$err = "<errorentry>\n";
$err .= "\t<datetime>" . $dt . "</datetime>\n";
$err .= "\t<errornum>" . $errno . "</errornum>\n";
$err .= "\t<errortype>" . $errortype[$errno] . "</errortype>\n";
$err .= "\t<errormsg>" . $errmsg . "</errormsg>\n";
$err .= "\t<scriptname>" . $filename . "</scriptname>\n";
$err .= "\t<scriptlinenum>" . $linenum . "</scriptlinenum>\n";

if (
in_array($errno, $user_errors)) {
$err .= "\t<vartrace>" . wddx_serialize_value($vars, "Variables") . "</vartrace>\n";
}
$err .= "</errorentry>\n\n";

// per testare
// echo $err;

// salva nel log degli errori e invia un e-mail se c'è un errore dell'utente critico
error_log($err, 3, "/usr/local/php4/error.log");
if (
$errno == E_USER_ERROR) {
mail("phpdev@example.com", "Critical User Error", $err);
}
}


function
distance($vect1, $vect2)
{
if (!
is_array($vect1) || !is_array($vect2)) {
trigger_error("Incorrect parameters, arrays expected", E_USER_ERROR);
return
NULL;
}

if (
count($vect1) != count($vect2)) {
trigger_error("Vectors need to be of the same size", E_USER_ERROR);
return
NULL;
}

for (
$i=0; $i<count($vect1); $i++) {
$c1 = $vect1[$i]; $c2 = $vect2[$i];
$d = 0.0;
if (!
is_numeric($c1)) {
trigger_error("Coordinate $i in vector 1 is not a number, using zero",
E_USER_WARNING);
$c1 = 0.0;
}
if (!
is_numeric($c2)) {
trigger_error("Coordinate $i in vector 2 is not a number, using zero",
E_USER_WARNING);
$c2 = 0.0;
}
$d += $c2*$c2 - $c1*$c1;
}
return
sqrt($d);
}

$old_error_handler = set_error_handler("userErrorHandler");

// costante non definita, genera un warning
$t = I_AM_NOT_DEFINED;

// definisce alcuni "array"
$a = array(2, 3, "foo");
$b = array(5.5, 4.3, -1.6);
$c = array(1, -3);

// genera un errore dell'utente
$t1 = distance($c, $b) . "\n";

// genera un altro errore dell'utente
$t2 = distance($b, "i am not an array") . "\n";

// genera un warning
$t3 = distance($a, $b) . "\n";

?>

add a note

User Contributed Notes 1 note

up
-3
delcroixenator at gmail dot com
2 years ago
For the above "distance" function to work properly, you must correct it as follows:
$d = 0.0; // must be moved before the for loop
$d += $c2*$c2 - $c1*$c1; // must be replaced by $d += ($c2 - $c1) ** 2 ;

Another thing: in the "userErrorHandler" function, the variables $vars and $user_errors are declared but not used.
To Top