set_error_handlerKullanıcı tanımlı bir hata işleyici bildirir
&reftitle.description;
callablenullset_error_handlercallablenullhata_işleyiciinthata_seviyeleriE_ALL
Betikteki hatalarda devreye girmek üzere kullanıcı tanımlı bir işlev
(hata_işleyici) bildirir.
Bu işlev çalışma anında özel bir hata işleyici oluşturmakta kullanılabilir.
Örneğin, veriler veya dosyalar temizlenirken 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 ismi
set_error_handler ile PHP'ye bildirilebilir.
Bu işlevin çağrılmasıyla PHP'nin standart hata işleyicisi
hata_seviyeleri ile belirtilen hata türleri için,
geri çağırım işlevi &false; döndürmedikçe tamamen devre dışı kalacaktır.
error_reporting ayarları etkisiz
olacak ve her durumda belirtilen hata işleyisi çağrılacaktır. Ancak,
error_reporting yönergesindeki
değer hala okubabilir ve buna göre davranılabilir.
Ayrıca, gerektiği takdirde exit işlevini çağırarak
betiğin çalışmasını durdurmak da işleyicinin sorumluluğundadı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 bildirilen
hata_işleyici işlevi çağrılamayacaktır.
&reftitle.parameters;
hata_işleyici
İşleve &null; aktarılırsa işleyici öntanımlı durumuna sıfırlanır.
Aksi takdirde, aşağıdaki geri çağırım işlevi tanımıyla bir işleyici
aktarılmalıdır:
boolhata_işleyiciinterrnostringerrstrstringerrfileinterrlinearrayerrcontexterrno
Oluşan hatanın seviyesinin bir tamsayı olarak aktarılacağı
bağımsız değişken. İlk bağımsız değişken olmalıdır.
errstr
Hata iletisinin bir dizge olarak aktarılacağı bağımsız değişken.
İkinci bağımsız değişken olmalıdır.
errfilehata_işleyici 3 bağımsız değişken kabul
ediyorsa, hatanın oluştuğu betik dosyasının ismini bir dizge olarak
içerecek, belirtilmesi isteğe bağlı üçüncü bağımsız değişken.
errlinehata_işleyici 4 bağımsız değişken kabul
ediyorsa, hatanın oluştuğu deyimin satır numarasını bir tamsayı
olarak içerecek, belirtilmesi isteğe bağlı dördüncü bağımsız
değişken.
errcontexthata_işleyici 5 bağımsız değişken kabul
ediyorsa, hatanın oluştuğu noktada etkin simge tablosuna işaret eden
bir diziyi kabul edecek, belirtilmesi isteğe bağlı beşinci bağımsız
değişken. Bu bağımsız değişken, başka bir deyişle, hatanın
tetiklendiği etki alanında etkin değişkenleri içeren bir dizidir.
hata_işleyici bu değişkenlerde bir değişiklik
yapmamalıdır.
Bu bağımsız değişken PHP 7.2.0 ve sonrasında
kullanımdan kaldırılmıştır. PHP 8.0.0'da
tamanen kaldırılmıştır. Eğer işlev bu
bağımsız değişkeni bir öntanımlı değer olmaksızın tanımlıyorsa,
işlev çağrıldığı takdirde, "too few arguments" (çok az bağımsız
değişken) hatası oluşur.
İşlev &false; döndürdüğü takdirde normal hata işleyici kaldığı yerden
devam eder.
hata_seviyelerihata_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.
&reftitle.returnvalues;
(Varsa) Evvelce tanımlanmış hata işleyicinin ismini dizge olarak
döndürür. Eğer yerleşik bir hata işleyici kullanılmışsa &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.
&reftitle.changelog;
&Version;&Description;8.0.0errcontext kaldırıldı ve artık kullanıcının
geri çağırım işlevine aktarılmayacak.
7.2.0errcontext kullanımdan kaldırıldı. Bu
bağımsız değişkenin kullanımı bir E_DEPRECATED
üretilmesine sebep olur.
&reftitle.examples;
- 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.
HATA [$hatanum] $ileti \n";
echo " $betik dosyasının $satırnum. satırında ölümcül hata";
echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ") \n";
echo "Çıkılıyor... \n";
exit(1);
case E_USER_WARNING:
echo "UYARI [$hatanum] $ileti \n";
break;
case E_USER_NOTICE:
echo "BİLGİ [$hatanum] $ileti \n";
break;
default:
echo "Bilinmeyen hata türü: [$hatanum] $ileti \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 bildir
$old_error_handler = set_error_handler("hataİşleyicim");
// Bazı hataları tetikle.
// Önce sayısal olmayan bir eleman içeren bir dizi tanımla.
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ı üret
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
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.
?>
]]>
&example.outputs.similar;
2
[1] => 3
[2] => foo
[3] => 5.5
[4] => 43.3
[5] => 21.11
)
----
ikinci durum - bir uyarı (b = log(PI) * a)
BİLGİ [1024] 2. değer bir sayı değil, 0 kullanılıyor
Array
(
[0] => 2.2894597716988
[1] => 3.4341896575482
[2] => 0
[3] => 6.2960143721717
[4] => 49.566804057279
[5] => 24.165247890281
)
----
üçüncü durum - bir uyarı
UYARI [512] Yanlış girdi, değerler dizi olarak verilmeliydi
NULL
----
dördüncü durum - ölümcül hata
HATA [256] x <= 0 için log(x) tanımsız, scale = -2.5 verilmiş
php-dnm dosyasının 36. satırında ölümcül hata, PHP 5.3.0beta2-dev
(Linux)
Çıkılıyor...
]]>
&reftitle.seealso;
ErrorExceptionerror_reportingrestore_error_handlertrigger_errorHata seviyesi
sabitleri