set_error_handler

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

set_error_handlerKullanıcı tanımlı bir hata eylemcisi bildirir

Açıklama

set_error_handler ( callback $hata_eylemci [, int $hata_türü = E_ALL | E_STRICT ] ) : mixed

Betikteki hatalarda devreye girmek üzere kullanıcı tanımlı bir işlev (hata_eylemci) 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 eylemcisi tamamen devre dışı kalacaktır. Bunu asla aklınızdan çıkarmayın. error_reporting() ayarları etkisiz olacak ve her durumda sizin hata eylemciniz ç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_eylemci 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, 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_eylemci işlevi çağrılamayacaktır.

Değiştirgeler

hata_eylemci

Kullanıcının tanımlayacağı bu işlev iki değiştirge kabul etmelidir: hata kodu ve hatayı açıklayan bir dizge. Bu iki değiştirgeden sonra isteğe bağlı üç değiştirge daha kabul edilebilir: hatanın oluştuğu dosya adı, hatanın oluştuğu satırın numarası ve hatanın oluştuğu bağlam (hatanın oluştuğu noktada etkin simge tablosuna işaret eden bir dizi). hata_eylemci işlevinin söz dizimi:

hata_eylemci ( int $hatano , string $ileti [, string $betik_adı [, int $hata_satırı [, array $hata_bağlamı ]]] )
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.

İşlev FALSE döndürdüğü takdirde normal hata eylemcisi kaldığı yerden devam eder.

hata_türü

hata_eylemci 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_eylemci işlevi çağrılacaktır.

Dönen Değerler

(Varsa) Evvelce tanımlanmış hata eylemcisinin ismini bir dizge olarak döndürür. Eğer yerleşik hata eylemcisi 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 eylemcisi 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
5.2.0 $php_errormsg kullanılması durumunda hata eylemcisi FALSE döndürmelidir.
5.0.0 hata_türü değiştirgesi kullanılabilir oldu.
4.3.0 hata_eylemci değiştirgesinde bir işlev ismi yerine bir nesne başvurusu ve bir yöntem ismi içeren bir dizi belirtebilmek mümkün oldu.
4.0.2 hata_eylemci işlevinin isteğe bağlı ek üç değiştirge (betik ismi, satır numarası ve bağlam) kabul edebilmesi mümkün oldu.

Ö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 eylemci işlevi
function hataEylemcim($hatanum$ileti$betik$satırnum)
{
    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);
        break;

    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 eylemcisi ç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 eylemcisini bildirelim
$old_error_handler set_error_handler("hataEylemcim");

// 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