set_error_handler

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

set_error_handlerKullanıcı tanımlı bir hata işleyici bildirir

Açıklama

set_error_handler ( callable $hata_işleyici , int $hata_türleri = E_ALL | E_STRICT ) : mixed

Betikteki hatalarda devreye girmek üzere kullanıcı tanımlı bir işlev (hata_işleyici) bildirir.

Bu işlev çalışma anında oluşan hatalardan kurtulmak için yapılacak işlemleri tanımladığınız bir işlevi PHP'ye bildirmek için kullanılır. Örneğin, verilerinizi veya dosyalarınızı temizlemek isterken işlemlerin durmasına yol açacak bir hata oluştuğunda veya belli durumlar için (trigger_error() ile) bir hatayı tetiklemek gerektiğinde PHP tarafından çağrılacak bir işlev tanımlayıp, bu işlevin ismini set_error_handler() ile PHP'ye bildirebilirsiniz.

Bu işlevin çağrılmasıyla PHP'nin standart hata işleyicisi hata_türleri ile beliirtilen hata türleri için, geri çağırım işlevi false döndürmedikçe tamamen devre dışı kalacaktır. Bunu asla aklınızdan çıkarmayın. error_reporting() ayarları etkisiz olacak ve her durumda sizin hata işleyiciniz çağrılacaktır. Ancak, error_reporting yönergesindeki değeri hala okuyabilecek ve buna göre davranabileceksiniz. Özellikle şuna dikkat edin: Eğer hataya sebep olan deyimin önüne bir @ hata denetim işleci konmuşsa bu değer 0 olacaktır.

Ayrıca şunu da aklınızdan çıkarmayın: Gerektiği takdirde die() işlevi de sizin sorumluluğunuzdadır. hata_işleyici işlevi döndükten sonra betiğin çalışması, hataya sebep olan deyimden sonraki deyimden devam edecektir.

Kullanıcı tanımlı bir işlev ile üzerinde herhangi bir işlem yapılamayacak hatalar vardır, bunlar: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, üretidiği yerden bağımsız E_COMPILE_WARNING ve set_error_handler() işlevinin çağrıldığı dosyada oluşan E_STRICT hatalarının çoğu.

Eğer betik çalıştırılmadan önce oluşan hatalar varsa (karşıya dosya yükleme sırasında oluşan hatalar gibi), bu gibi durumlar için bildirdiğiniz hata_işleyici işlevi çağrılamayacaktır.

Değiştirgeler

hata_işleyici

Aşağıdaki imzayla bir geri çağırım işlevi. İşleyiciyi öntanımlı durumuna sıfırlamak için işleve null aktarılabilir. Bir işlev adı yerine, bir nesne başvurusu ve bir yöntem adı içeren bir dizi de sağlanabilir.

hata_işleyici ( int $hatano , string $ileti , string $betik_adı = ? , int $hata_satırı = ? , array $hata_bağlamı = ? ) : bool
hatano
Oluşan hatanın seviyesini içeren bir tamsayı. İlk değiştirge olmalıdır.
ileti
Hata iletisini içeren bir dizge. İkinci değiştirge olmalıdır.
betik_adı
Hatanın oluştuğu betik dosyasının ismini bir dizge olarak içeren, belirtilmesi isteğe bağlı üçüncü değiştirge.
hata_satırı
Hatanın oluştuğu deyimin satır numarasını bir tamsayı olarak içeren, belirtilmesi isteğe bağlı dördüncü değiştirge.
hata_bağlamı
Hatanın oluştuğu noktada etkin simge tablosuna işaret eden bir diziyi kabul eden, belirtilmesi isteğe bağlı beşinci değiştirge. Bu değiştirge, başka bir deyişle, hatanın tetiklendiği etki alanında etkin değişkenleri içeren bir dizidir. İşlev bu değişkenlerde bir değişiklik yapmamalıdır.
Uyarı

Bu değiştirge PHP 7.2.0 ve sonrasında kullanımdan kaldırılmıştır. Buna güvenmek son derece cesaret kırıcıdır.

İşlev false döndürdüğü takdirde normal hata işleyici kaldığı yerden devam eder.

hata_türü

hata_işleyici işlevini tetikleyecek hatalar sabitleriyle, error_reporting yönergesine gösterilecek hataların değerleri belirtilirken yapıldığı gibi bir bit maskesi olarak belirtilebilir. Bu maskenin belirtilmediği durumda, error_reporting yönergesinde belirtilen değere bakılmaksızın her hatada hata_işleyici işlevi çağrılacaktır.

Dönen Değerler

(Varsa) Evvelce tanımlanmış hata işleyicinin ismini bir dizge olarak döndürür. Eğer yerleşik bir hata işleyici kullanılmışsa null döner. Ayrıca belirtilen geriçağırım işlevinin geçersiz olduğu durumda da null döner. Eğer evvelki hata işleyici bir sınıfın yöntemi ise bu sınıfın ve yöntemin isimlerini içeren bir dizi döner.

Sürüm Bilgisi

Sürüm: Açıklama
7.2.0 hata_bağlamı kullanımdan kaldırıldı. Bu değiştirgenin kullanımı bir E_DEPRECATED üretilmesine sebep olur.

Örnekler

Örnek 1 - set_error_handler() ve trigger_error() ile hataların ele alınması

Bu örnekte hatalar tetiklenerek oluşan dahili istisnaların kullanıcı tanımlı bir işlev ile ele alınması gösterilmiştir.

<?php
// hata işleyici işlevi
function hataİşleyicim($hatanum$ileti$betik$satırnum)
{
    if (!(
error_reporting() & $hatanum)) {
        
// Bu hata kodu error_reporting'e dahil olmaz, bu yüzden 
        // standart PHP hata işleyicisine düşmesine izin verin
        
return false;
    }

    
// $ileti önceleme gerektirebilir
    
$ileti htmlspecialchars($ileti);

    switch (
$hatanum) {
    case 
E_USER_ERROR:
        echo 
"<b>HATA</b> [$hatanum$ileti<br />\n";
        echo 
"  $betik dosyasının $satırnum. satırında  ölümcül hata";
        echo 
", PHP " PHP_VERSION " (" PHP_OS ")<br />\n";
        echo 
"Çıkılıyor...<br />\n";
        exit(
1);

    case 
E_USER_WARNING:
        echo 
"<b>UYARI</b> [$hatanum$ileti<br />\n";
        break;

    case 
E_USER_NOTICE:
        echo 
"<b>BİLGİ</b> [$hatanum$ileti<br />\n";
        break;

    default:
        echo 
"Bilinmeyen hata türü: [$hatanum$ileti<br />\n";
        break;
    }

    
/* PHP'nin yerleşik hata işleyici çalışmasın */
    
return true;
}

// Hatanın oluşacağı işlev
function scale_by_log($vect$scale)
{
    if (!
is_numeric($scale) || $scale <= 0) {
        
trigger_error("x <= 0 için log(x) tanımsız, scale = $scale verilmiş",
                      
E_USER_ERROR);
    }

    if (!
is_array($vect)) {
        
trigger_error("Yanlış girdi, değerler dizi olarak verilmeliydi",
                      
E_USER_WARNING);
        return 
null;
    }

    
$temp = array();
    foreach(
$vect as $pos => $value) {
        if (!
is_numeric($value)) {
            
trigger_error("$pos. değer bir sayı değil, 0 kullanılıyor",
                          
E_USER_NOTICE);
            
$value 0;
        }
        
$temp[$pos] = log($scale) * $value;
    }

    return 
$temp;
}

// kullanıcı tanımlı hata işleyiciyi bildirelim
$old_error_handler set_error_handler("hataİşleyicim");

// Bazı hataları tetikleyelim.
// Önce sayısal olmayan bir eleman içeren bir dizi tanımlayalım.
echo "ilk durum; bir hata: sayı yerine dizge\n";
$a = array(23"foo"5.543.321.11);
print_r($a);

// burada ikinci hatayı üretiyoruz
echo "----\nikinci durum - bir uyarı (b = log(PI) * a)\n";
/* $pos. değer bir sayı değil, 0 kullanılıyor */
$b scale_by_log($aM_PI);
print_r($b);

// Bir dizi yerine bir dizge aktarıp yine sorun çıkarıyoruz
echo "----\nüçüncü durum - bir uyarı\n";
/* Yanlış girdi, değerler dizi olarak verilmeliydi */
$c scale_by_log("not array"2.3);
var_dump($c); // NULL

// Bu önemli bir hata; sıfır veya negatif bir sayının logaritması.
echo "----\ndördüncü durum - ölümcül hata\n";
/* x <= 0 için log(x) tanımsız, scale = $scale olmalıydı */
$d scale_by_log($a, -2.5);
var_dump($d); // Bu satır hiç çalışmayacak.
?>

Yukarıdaki örnek şuna benzer bir çıktı üretir:

ilk durum; bir hata: sayı yerine dizge
Array
(
    [0] => 2
    [1] => 3
    [2] => foo
    [3] => 5.5
    [4] => 43.3
    [5] => 21.11
)
----
ikinci durum - bir uyarı (b = log(PI) * a)
<b>BİLGİ</b> [1024] 2. değer bir sayı değil, 0 kullanılıyor<br />
Array
(
    [0] => 2.2894597716988
    [1] => 3.4341896575482
    [2] => 0
    [3] => 6.2960143721717
    [4] => 49.566804057279
    [5] => 24.165247890281
)
----
üçüncü durum - bir uyarı
<b>UYARI</b> [512] Yanlış girdi, değerler dizi olarak verilmeliydi<br />
NULL
----
dördüncü durum - ölümcül hata
<b>HATA</b> [256] x <= 0 için log(x) tanımsız, scale = -2.5 verilmiş<br />
  php-dnm dosyasının 36. satırında  ölümcül hata, PHP 5.3.0beta2-dev
  (Linux)<br />
Çıkılıyor...<br />

Ayrıca Bakınız