2011-01-27 21 views
23

PHP, ben bazen try/catch ile bazı istisnalar yakalamak: kodun bu tür ileYakalama yakalama şey yapmadan bir istisna

try { 
    ... 
} catch (Exception $e) { 
    // Nothing, this is normal 
} 

, ben ise değişken $ e ile bitirmek Hiçbir şey (çok sayıda kaynak) için oluşturulan ve PHP_MD (PHP Mess Detector) kullanılmayan bir değişken nedeniyle bir uyarı oluşturur.

Bir değişken oluşturmak zorunda kalmadan bir özel durum yakalamanın bir yolu var mı?

Teşekkür

istisnalar bütün mesele
+1

Bir istisna "normal" olarak değerlendirilmemelidir - bu bir istisna ya da değil. İstisnaları ne atıyor? –

+0

Modelin gerektiğinde bir istisna attığını test ediyorum. Yani boş catch bloğum var çünkü sadece istisnanın atıldığını test etmek istiyorum. –

cevap

6

- Eğer işlemek isterdim herhangi özel durumları yakalamak için birden fazla farklı catch bloğu olabilir. Özel durumun verileri bir yere atanmalıdır, dolayısıyla değişken. Bu uyarıları görmek istemiyorsanız veya uyarıları (genellikle kötü bir fikir) devre dışı bırakmak istiyorsanız, catch bloğunun içinde unset($e) gibi bir şey yapabilirsiniz.

6

Her durumda sayılı

, istisna yakalamak ve hiçbir şey yapmak kötü bir fikir genellikle var; İstisnai koşullara (aksi halde yürütme iptal edilir) karşı koymaya zorlamak için istisnalar vardır, bu nedenle dilin böyle bir kullanım durumunu kolaylaştırdığı anlaşılırdır.

+3

Aynı zamanda, muhtemelen yalnızca bir durum koduna ihtiyaç duyduğunuzda bir istisna atmak kötü bir fikirdir. İstisnalar istisnai olsaydı, çok fazla işe yaramaz deneme/yakalama bloğu göremeyiz. Özellikle, bir çok ağ yardımcı programı, bir ağ sorunu olduğunda, kapsüllemeyi kıran ve programcıya gerçekten yardımcı olmayan bir istisna atar. Bir ağ yardımcı programı olduğunuzda ağ sorunu istisnai olmamalı, dahili olarak halledebilmeniz gerekir. –

+0

Peki bu çoğunlukla testler içindir: istisnanın atıldığını test edin ... –

-1

İstisnalar sadece istisnai durumlar için kullanılmaz.

Bu senaryoda, kullanıcının oturumu kapattığından emin olmak için istisnalar kullanılmaktadır. Senaryosunda bu noktada, hangi verilerin budanması gerektiğini anlamak çok pahalı bir kaynaktır, bu yüzden hepsini daha hızlı bir şekilde ayarlamak ve istisnaları yakalamak daha hızlıdır.

 try { 
     GDS::$DB->exec('DELETE FROM sessions WHERE session_id = ' . session_id()); 
     GDS::$DB->exec('DELETE FROM sessions WHERE user_id = ' . $this->data['user_id']); 
    } catch(PDOException $ex) {} 
    session_regenerate_id(true); 
    setcookie('bis_[user_id]', 0, time() - 1, null, null, false, true); 
    setcookie('bis_[session_start]', 0, time() - 1, null, null, false, true); 
    setcookie('bis_[session_time]', 0, time() - 1, null, null, false, true); 
+6

Bu nasıl bir cevap? –

+0

plus, bu, ilk atımlarsa ikinci ifadeyi atlar; – Artefacto

3

Hayır, ancak bunu kaldırabilirsiniz.

try { 
    ... 
} catch (Exception $e) { 
    unset($e); 
} 

Sadece istisnayı yakaladığınızı varsayıyorum çünkü istediğiniz gibi değilsiniz. try kullanmak için catch kullanmanız gerekir. Bu nedenle, halkın istisnayı yakalamanın kötü bir fikri olup olmadığı konusundaki görüşler önemsizdir. try/catch kullanmadan istenen sonuca ulaşmak için çaba gösterilmelidir. Farkında olduğum kadarıyla başka seçenek yok.

Şablonlama motorum için böyle bir şey kullanıyorum.

//array of templates ordered by version new to old. 
for($templates as $tpl){ 
    try { 
     $output = render($tpl,$data); 
     //it worked 
     break; 
    } catch(ErrorException $e){ 
     unset($e); 
    } 
} 
if(!empty($output)){ 
    return $output; 
}