(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)
set_error_handler — Kullanıcı tanımlı bir hata işleyici bildirir
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.
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.
$hatano
, string $ileti
, string $betik_adı
= ?
, int $hata_satırı
= ?
, array $hata_bağlamı
= ?
) : boolhatano
ileti
betik_adı
hata_satırı
hata_bağlamı
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.
(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: | 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.
|
Ö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(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 />