PHP try-catch blokları: bunlar geçersiz arg tiplerini yakalamak mümkün?

4 Cevap php

Background: Ben şu besbelli-yanlış PHP olduğunu varsayalım:

    try{
        $vtest = '';
        print(array_pop($vtest));
    }catch(Exception $exx){}

O array_pop ile çalışmak için, $ vtest Açıkçası bir dizi değil, bir dize olmalıdır. Bu kodu çalıştırdığınızda Yine Uyarı sergilenmektedir. Ben sadece kod sessizce başarısız istiyorum, istemiyorum.

Question: PHP try-catch ile ilgili özel bir şey bu çalışmamasına neden diğer dillere göre var mı?

Disclaimer: Just for reference, there are other ways to handle this situation in PHP.

The "at-sign" trick:

        $vtest = '';
        print(@array_pop($vtest)); // <-- would like to avoid this

Type Casting:

        $vtest = '';
        $vtest = (array)$vtest;  
        print(array_pop($vtest));

4 Cevap

Uyarılar ve bildirimler PHP teknik istisna değildir. Açıkça atılan gereken bir durum yakalamak için, ve işlevleri yerleşik kütüphaneleri birçok (PHP istisna desteklenen önce onlar yazılmış çünkü çoğunlukla) istisnalar atmayın.

Şekilde istisnalar mevcut haber / uyarı / hata çerçevesinin üstüne inşa edildi ama belki de bu çok fazla soran eğer güzel olurdu.

Bir uyarı her zaman sağlanan kod tarafından üretilen olacak ama set_error_handler uyarı nasıl işleneceğini dikte için kullanabilirsiniz; yani bunu bir özel durum neden olabilir. Ayrıca, restore_error_handler senin bitmiş hata işleme varsayılan dönmek için kullanabilirsiniz.

function errorHandler($errno, $errstr, $errfile, $errline) {
    throw new Exception($errstr, $errno);
}
set_error_handler('errorHandler');

Eğer bir istisna her hatayı dönüştürmek zaman böyle hataları yakalayabilirsiniz. Biraz kurdunuz error-handling environment. Sadece bunu test - çalışacaktır.

Aklıma tek yolu aşağıdaki yapmak olacaktır:

try{
    $vtest = '';
    if(is_array($vtest)){
        print(array_pop($vtest));
    }
    else{
        throw new NotArrayException()
    }
}catch(NotArrayException $exx){}

Eğer herhangi bir istisna yakalamak gerek yok çünkü Tabii ki sadece bunu yapmak istiyorsanız, sessizce sadece aşağıdaki yapabilirdi:

    $vtest = '';
    if(is_array($vtest)){
        print(array_pop($vtest));
    }