Neden benim özel hata işleyicisi denir değil mi?

3 Cevap php

Benim komut başladığında, ben var:

error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

Ve sonra, ben PHP ile benim özel hata işleyicisi kayıt:

function handleError($code, $text, $file, $line) {
    echo "&%!!";
    return true;
}

set_error_handler('handleError');

Sonraki, böyle bir hata üretir bazı kod geliyor:

Fatal error: Call to undefined method DB::getInstanceForDB() in /Applications/MAMP/htdocs/mysite/classes/Test.php on line 32

Ben bir özel hata işleyicisi belirtmek olmadığını çağrı yığını ve siteme, hiçbir konuda her şeyi ile standart PHP hata mesaj kutusu almaya devam. Herhangi bir fikir sorun ne?

Edit: Ne olursa olsun ben doğru ya da değil dönerseniz, benim özel işleyici aramıyor.

3 Cevap

Öncelikle, sizin hata işleme fonksiyonu dönüş doğru yapmak gerekir. Dan set_error_handler:

FALSE dönerse normal hata işleyicisi devam ediyor.

İkincisi, ölümcül hataları set_error_handler tarafından ele olmadığını unutmayın. Siz de register_shutdown_function kullanmanız gerekir. Yani kod bu gibi görünmelidir:

// Handles non-fatal errors
function handleError($code, $text, $file, $line) {
    var_dump($code);
    return true;
}
set_error_handler('handleError');

// Handles fatal errors
function fatalShutdown() {
    var_dump(error_get_last());
}
register_shutdown_function('fatalShutdown');

Kabul cevabı bir sayfa başarıyla tamamlandığında sadece zaman bir kapatma işlevi başka bir yerde ele olanlar da dahil olmak üzere, tüm kapatmalar denir çünkü yanlış ya.

Ben set_exception_handler ve set_error_handler kullanmanın yanı sıra, bu ile sona erdi:

// from http://www.php.net/manual/en/function.set-error-handler.php
define('FATAL', E_ERROR | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING);

register_shutdown_function('shutdown');

// Handles "fatal" errors e.g. Syntax errors
function shutdown() {
    // Only if there was an fatal error, this is run on all execution endpoints
    $error_info = error_get_last();
    if ($error_info !== null && ($error_info['type'] & FATAL)) {
        # stack trace set to empty array, as generating one here is useless
        [[ do stuff like emailing someone]]
    }
}