(PHP 4 >= 4.0.1, PHP 5)
set_error_handler — Kullanıcı tanımlı bir hata eylemcisi bildirir
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.
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:
$hatano
, string $ileti
[, string $betik_adı
[, int $hata_satırı
[, array $hata_bağlamı
]]] )hatano
ileti
betik_adı
hata_satırı
hata_bağlamı
İş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.
(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: | 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.
|
Ö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(2, 3, "foo", 5.5, 43.3, 21.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($a, M_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 />