Ben de deneyebilir miyim / bir uyarı yakalamak?

7 Cevap php

Bazı php yerli fonksiyonlarından atılan bazı uyarıları yakalamak ve daha sonra bunları işlemek gerekir.

Özellikle:

array dns_get_record  ( string $hostname  [, int $type= DNS_ANY  [, array &$authns  [, array &$addtl  ]]] )

DNS sorgusu başarısız olduğunda bir uyarı atar.

Bir uyarı, bir istisna değildir, çünkü try / catch çalışmaz.

Şimdi 2 seçeneğiniz var:

  1. (? Bu doğrudur) her sayfasında uyarı filtre kullanmak zorunda çünkü set_error_handler overkill gibi görünüyor;

  2. Bu yüzden bu uyarılar ekrana yankılandı alamadım hata raporlama / ekranı ayarlamak, daha sonra dönüş değerini kontrol; o false ise, hiçbir kayıt konakadını bulundu.

Burada en iyi uygulama nedir?

7 Cevap

Bir olasılık çağrısından önce kendi hata işleyicisi ayarlamak ve restore_error_handler() ile daha önceki hata işleyicisi geri yüklemektir. Zend Framework çeşitli yerlerde yapar. MEZUNLARI bazı discussion Son zamanlarda özgün istisnalar PHP hataları değiştirilmesiyle ilgili PHP haber orada öyleydi.

Bir başka olasılık @ operatörü ile çağrı bastırmak ve dns_get_record() sonra dönüş değerini kontrol etmektir. Hatalar / uyarılar bastırılmış değil, ele alınması gereken tetiklenir Ama ben buna karşı tavsiye ediyorum.

sidenote

Sen istisnalar içine tüm php hataları açmak için set_error_handler() ve ErrorException class kullanabilirsiniz.

function handleError($errno, $errstr, $errfile, $errline, array $errcontext)
{
    // error was suppressed with the @-operator
    if (0 === error_reporting()) {
        return false;
    }

    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler('handleError');

try {
    dns_get_record();
}
catch (ErrorException $e) {
    // ...
}

@ Operatörü ile dikkatli olun - bu uyarıları bastırır ederken aynı zamanda ölümcül hataları bastırır. Ben ('...') birisi @ mysql_query yazmış bir sistemde bir sorun hata ayıklama çok zaman geçirdim ve sorun mysql desteği PHP yüklü değil idi ve sessiz bir ölümcül hata attı. Bu PHP çekirdeğinin ama please dikkatli kullanınız parçası olan şeyler için güvenli olacaktır.

bob@mypc:~$ php -a
Interactive shell

php > echo @something(); // this will just silently die...

Başka çıkış - iyi şanslar Bu hata ayıklama!

bob@mypc:~$ php -a
Interactive shell

php > echo something(); // lets try it again but don't suppress the error
PHP Fatal error:  Call to undefined function something() in php shell code on line 1
PHP Stack trace:
PHP   1. {main}() php shell code:0
bob@mypc:~$ 

Neden başarısız Bu kez biz görebiliriz.

Hata işleyicisi ayarlamak için 1 - Ben henüz yeterince temsilcisi yok çünkü ben upvote olamaz.

Gerçekten öyle gibi, E_WARNING parametresi ile basit hata işleyicisi ayar olduğu ortaya çıktı işleri çözümü:

set_error_handler("warning_handler", E_WARNING);

dns_get_record(...)

function warning_handler($errno, $errstr) { 
// do something
}

Muhtemelen tamamen uyarı kurtulmak için denemelisiniz, ama bu mümkün değil ise, @ ile çağrı (yani @ dns_get_record (...)) Önlerine ve ardından uyarı olduysa anlamaya alabilirsiniz herhangi bir bilgi kullanın ya da.

Bu tek çözüm olmadığı sürece Normalde siz @ kullanmak asla. Bu özel durumda fonksiyon dns_check_record kayıt varsa bilmek siz kullanmak gerekir.

dns_get_record() başarısız olursa, FALSE döndürmesi gerekir, böylece @ ile uyarı bastırmak ve daha sonra dönüş değerini kontrol edebilirsiniz.

Ben bir uyarı yakalamaya / denemek istedim, ama aynı zamanda (örn /var/log/apache2/error.log) oturum olağan uyarı / hata tutmak; işleyici dönmek sahip olduğu için false. Ancak, bu yana, "yeni atmak ..." ifadesi temelde yürütme, bir sonra da tartışılan "fonksiyonunda wrap" hile yapmak zorunda keser:

Is there a static way to throw exception in php

Ya da kısaca:

  function throwErrorException($errstr = null,$code = null, $errno = null, $errfile = null, $errline = null) {
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
  }
  function warning_handler($errno, $errstr, $errfile, $errline, array $errcontext) {
    return false && throwErrorException($errstr, 0, $errno, $errfile, $errline);
    # error_log("AAA"); # will never run after throw
    /* Do execute PHP internal error handler */
    # return false; # will never run after throw
  }
  ...
  set_error_handler('warning_handler', E_WARNING);
  ...
  try {
    mkdir($path, 0777, true);
  } catch (Exception $e) {
    echo $e->getMessage();
    // ...
  }

EDIT: daha yakından inceleme sonrası, bu işe yaramazsa çıkıyor: "return false && throwErrorException ...", temelde, not istisna ve sadece hata günlüğüne giriş olacaktır; "return throwErrorException ..." içinde, iş atma istisna yapacak, ama sonra error_log oturum olmayacak gibi "false &&" bölümünü kaldırarak ... Ben hala bu yayınlanmıştır saklardım olsa da, ben görmedim gibi bu davranış başka bir yerde belgelenmiştir.