set_error_handler Kullanıcı tanımlı bir hata işleyici bildirir &reftitle.description; callablenull set_error_handler callablenullhata_işleyici inthata_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şleyici interrno stringerrstr stringerrfile interrline arrayerrcontext errno 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. 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. &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.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. &reftitle.examples; - <function>set_error_handler</function> ve <function>trigger_error</function> 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; ErrorException error_reporting restore_error_handler trigger_error Hata seviyesi sabitleri