Ricerca…


Impostazione della segnalazione degli errori e dove visualizzarli

Se non è già stato fatto in php.ini, la segnalazione degli errori può essere impostata dinamicamente e dovrebbe essere impostata per consentire la visualizzazione della maggior parte degli errori:

Sintassi

int error_reporting ([ int $level ] )

Esempi

// should always be used prior to 5.4
error_reporting(E_ALL);

// -1 will show every possible error, even when new levels and constants are added 
// in future PHP versions. E_ALL does the same up to 5.4.
error_reporting(-1);

// without notices
error_reporting(E_ALL & ~E_NOTICE);

// only warnings and notices.
// for the sake of example, one shouldn't report only those
error_reporting(E_WARNING | E_NOTICE);

gli errori verranno registrati di default da php, normalmente in un file error.log allo stesso livello dello script in esecuzione.

nell'ambiente di sviluppo, è possibile anche mostrarli sullo schermo:

ini_set('display_errors', 1);

in produzione, tuttavia, si dovrebbe

ini_set('display_errors', 0);

e mostra un messaggio di problema amichevole attraverso l'uso di un gestore di eccezioni o errori.

Eccezione e gestione degli errori

prova a prendere

try..catch blocchi di controllo possono essere utilizzati per controllare il flusso di un programma in cui possono essere lanciate eccezioni . Possono essere catturati e gestiti con garbo piuttosto che lasciare che PHP si fermi quando viene incontrato:

try {
    // Do a bunch of things...
    throw new Exception('My test exception!');
} catch (Exception $ex) {
    // Your logic failed. What do you want to do about that? Log it:
    file_put_contents('my_error_log.txt', $ex->getMessage(), FILE_APPEND);
}

L'esempio precedente catch l'eccezione lanciata nel blocco try e registrerà il suo messaggio ("My test exception!") In un file di testo.

Cattura diversi tipi di eccezioni

È possibile implementare più istruzioni catch per diversi tipi di eccezioni da gestire in diversi modi, ad esempio:

try {
    throw new InvalidArgumentException('Argument #1 must be an integer!');
} catch (InvalidArgumentException $ex) {
    var_dump('Invalid argument exception caught: ' . $ex->getMessage());
} catch (Exception $ex) {
    var_dump('Standard exception caught: ' . $ex->getMessage());
}

Nell'esempio precedente verrà utilizzato il primo catch poiché corrisponde per primo nell'ordine di esecuzione. Se si scambia l'ordine delle istruzioni catch , il catcher Exception eseguito per primo.

Allo stesso modo, se si dovesse lanciare un UnexpectedValueException invece si dovrebbe vedere il secondo gestore per uno standard Exception in uso.

finalmente

Se avete bisogno di qualcosa da fare dopo il verificarsi di una try o un catch corsa è terminata, è possibile utilizzare una finally dichiarazione:

try {
    throw new Exception('Hello world');
} catch (Exception $e) {
    echo 'Uh oh! ' . $e->getMessage();
} finally {
    echo " - I'm finished now - home time!";
}

L'esempio precedente produrrebbe quanto segue:

Uh Oh! Ciao mondo - Sono finito ora - A casa!

throwable

In PHP 7 vediamo l'introduzione dell'interfaccia Throwable , che implementa Error e Exception . Questo aggiunge un livello di contratto di servizio tra le eccezioni in PHP 7 e consente di implementare l'interfaccia per le proprie eccezioni personalizzate:

$handler = function(\Throwable $ex) {
    $msg = "[ {$ex->getCode()} ] {$ex->getTraceAsString()}";
    mail('[email protected]', $ex->getMessage(), $msg);
    echo myNiceErrorMessageFunction();
};
set_exception_handler($handler);
set_error_handler($handler);

Prima di PHP 7 puoi semplicemente digitare Exception poiché da PHP 5 tutte le classi di eccezioni lo estendono.

Registrazione degli errori fatali

In PHP, un errore fatale è un tipo di errore che non può essere rilevato, ovvero, dopo aver riscontrato un errore irreversibile, un programma non viene ripristinato. Tuttavia, per registrare questo errore o in qualche modo gestire l'arresto è possibile utilizzare register_shutdown_function per registrare il gestore di shutdown.

function fatalErrorHandler() {
    // Let's get last error that was fatal.
    $error = error_get_last();
   
    // This is error-only handler for example purposes; no error means that
    // there were no error and shutdown was proper. Also ensure it will handle 
    // only fatal errors.
    if (null === $error || E_ERROR != $error['type']) {
        return;
    }

    // Log last error to a log file.
    // let's naively assume that logs are in the folder inside the app folder.
    $logFile = fopen("./app/logs/error.log", "a+");

    // Get useful info out of error.
    $type    = $error["type"];
    $file    = $error["file"];
    $line    = $error["line"];
    $message = $error["message"]

    fprintf(
        $logFile,
        "[%s] %s: %s in %s:%d\n",
        date("Y-m-d H:i:s"),
        $type,        
        $message,
        $file, 
        $line);

    fclose($logFile);       
}


register_shutdown_function('fatalErrorHandler');

Riferimento:



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow