array ( 0 => 'index.php', 1 => 'PHP Manual', ), 'head' => array ( 0 => 'UTF-8', 1 => 'tr', ), 'this' => array ( 0 => 'function.set-error-handler.php', 1 => 'set_error_handler', ), 'up' => array ( 0 => 'ref.errorfunc.php', 1 => 'Hata İşleme İşlevleri', ), 'prev' => array ( 0 => 'function.restore-exception-handler.php', 1 => 'restore_exception_handler', ), 'next' => array ( 0 => 'function.set-exception-handler.php', 1 => 'set_exception_handler', ), 'alternatives' => array ( ), 'source' => array ( 'lang' => 'tr', 'path' => 'reference/errorfunc/functions/set-error-handler.xml', ), ); $setup["toc"] = $TOC; $setup["toc_deprecated"] = $TOC_DEPRECATED; $setup["parents"] = $PARENTS; manual_setup($setup); ?>
(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 ö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.
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:
$errno
,$errstr
,$errfile
= ?,$errline
= ?,$errcontext
= ?errno
errstr
errfile
hata_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.
errline
hata_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.
errcontext
hata_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_seviyeleri
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 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.
Sürüm: | Açıklama |
---|---|
8.0.0 |
errcontext kaldırıldı ve artık kullanıcının
geri çağırım işlevine aktarılmayacak.
|
7.2.0 |
errcontext kullanımdan kaldırıldı. Bu
bağımsız değişkenin 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 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.
?>
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 />