Try {} catch {} kullanmanın avantajı karşısında ne ise {} else {}

10 Cevap php

Ben PDO php mysql düz geçiş yaşıyorum ve ben hataları test etmek için ortak bir yol bir try / catch kombinasyonu kullanılarak yerine if / else kombinasyonları olduğunu fark etmişsinizdir.

Bu yöntemin avantajı nedir, ben bunun yerine birkaç iç içe bir try / catch bloğu kullanabilirsiniz eğer farklı adımlar (vb, yürütmek, hazırlamak, bağlamak) için tüm hataları işlemek için / else blokları?

10 Cevap

Sunucu aşağı olmak, kimlik sona ermiş veya yanlış gibi - kodu ile normal bir yol hata vermeden devam etmelidir bazı istisnai durumlar gerçekten olmadıkça I try / catch bloğu kullanmak istiyorum. Ben ille olmayan olağanüstü hataları işlemek için kullanmak olmaz - geçerli kullanıcı doğru rolünde olmama gibi söylüyorlar. Eğer makul bekliyoruz ve ben size kontrolleri yapmak gerektiğini düşünüyorum, istisnai bir durum değildir bir hata işleyebilir olmasıdır.

Eğer anlattığım durumda - kurma ve bir sorgu yapmak, bir try / catch bloğu normalde sorgu başarılı bekliyoruz olarak işlemek için mükemmel bir yoldur. Öte yandan, muhtemelen sonucu içeriği yerine sadece amaç için geçerli olmayabilir verilerini kullanmak için çalışırken daha kontrol akış mantığı ile beklemek ne olduğunu kontrol etmek isteyeceksiniz.

Sizin için dışarı bakmak istediğiniz bir şey try / catch özensiz kullanımıdır. "Ben bu yüzden bir try / catch kaydırmak için gidiyorum bu yapmak ve en iyi için umut ne olacağını bilmiyorum" nazik - try / catch kötü programlama kendinizi korumak için kullanılmamalıdır programlama. Genellikle Eğer bulmak ve (null işaretçiler, vb kodu ilgili hataları düzeltmek böylece kodunun kendisi (sunucu aşağı, kötü kimlik bilgileri, vb) ilgili olmayan kişilere yakalamak istisnalar türlerini kısıtlamak için isteyeceksiniz .).

Genel olarak, try-catch istisna oluştuğunda onlar (catch deyimine hareket) kıracak çünkü bloklar büyüktür. If-else blokları hata ne zaman olacağını tahmin güveniyor.

Edit: Also, catch blocks won't stop your code from halting when an error is hit.

Bu bir deneyin / catch yerine birden if ifadeleri kullanarak, tam avantaj. Ayrıca herhangi bir beklenmeyen hataları yakalamak mümkün olacaktır.

Try / catch, ve genel olarak istisnalar avantajı, insanların PDO gibi developing kütüphaneler için daha fazladır. Onlar bir sistem geliştirici hızlı ve kolay bir şekilde tanımlanmamış durumları veya beklenmeyen sonuçlarını işlemek için izin verir. Bir veritabanı bağlantısı atın. Ne should bir sistem veritabanı ulaşılamazsa yoksa. Bunun durdurulması gerekir? Tekrar dene? Bir uyarı atmak ve devam? Sistem geliştiricisi daha sonra yakalamak ve idare edeceğiz, hangi onlar bir istisna, bunu yapmak için ne gerekir bilemez.

Sistemin bir tüketici olarak sizin için avantaj, oldukça geri bazı belirsiz hata kodu alıyorsanız daha, ya da başarısız olduğunu yanlış bir basit boolean, bir durum nesne olsun hangi olacak

  1. Bu ne yanlış gitti daha belirgin olduğunu, böyle bir şekilde adlandırılır (Eğer doğru hatırlıyorum, PDO yalnızca bir durum türü vardır, fakat diğer sistemler hatalar farklı türleri için birden fazla istisna türlerini içerir)

  2. / why özel durum yöntemleri ve anlamaya yardımcı olabilir özellikleri içermelidir edebilir

Yani zaten teori. İstisnalar gitmek için yoludur iddia akıllı bir sürü insan vardır. İstisnalar şeytan olduğunu düşünüyorum akıllı bir sürü insan, ve tembel sistem geliştiriciler için bir koltuk değneği de vardır. Bu konuda hiçbir şey benzeyen bir görüş birliği vardır.

PDO nesneleri kullanarak beri bir hata ortaya çıkarsa, onlar İstisnalar artırıyorlar. Eski mysql / mysqli sadece işlevleri vardı ve onlar sadece hata kodları döndürdü İstisnalar atmadım. Bir İstisna kodundan atılmış olabilir, ve hataları işlemek için bir nesne yönelimli bir yoldur catch-fıkra, onu yakalamak zaman deneyin / catch kullanılır. Onlar try / catch şey paylaşmak - Sen / else blokları halinde olan İstisnalar yakalamak olamaz.

Yakala / deneyin tamamen nesne iş mantığı hata işleme mantığı ayırır.

@ Perchik:

Hata işleme Benim genel felsefesi:

Sen should beklediğiniz tüm davalarını if / else kullanın. Yararlı bir durum yükseltilmiş olabilir ve bunu bir hata varlığı hakkında bilgi edinebilirsiniz çünkü not everything (çoğu durumda) işlemek için try {} catch {} kullanmalısınız. Sen should / go olacaktır olabilir yanlış bir şey şüpheli ve ağ zaman aşımı / dosya sistemi erişim sorunları gibi tüm sistemi, dosyaları aşağı getirmek istemiyorum durumlarda try {} catch {} kullanabilirsiniz , vb yoktur

Vexing exceptions

Bir istisna atma ve yakalama diğer bir çok ilkel çalışma ile karşılaştırıldığında pahalı bir işlemdir. Bu (bir döngü içinde, örneğin) iyi performans için gereken kod parçası ise, kullanımı durumda bakmak istiyorum - Eğer istisnalar nispeten daha sık atılmasını bekliyoruz eğer, bir if ile daha iyi olacak / else performansı bir-bilge (altta yatan kod sadece tüm hiçbir kazanç yoktur, bu durumda sizin için bir istisna sarma sürece). Istisnalar sadece nadir durumlarda atılır, o zaman sıkı bir döngü içinde dallanma yükünü önlemek için bir try / catch daha iyiyiz.

Herkes iyi cevap vardı - ama ben benim kendi atmak düşündüm:

  1. Deneyin / Yakala gerçek bir istisna işleme mekanizması - yani sizin istisnalar değiştirirseniz, otomatik olarak tüm deneyin / catch tablolar üzerinde çalışacak.
  2. Deneyin / Yakala bile / else ve ek olarak (eğer anlayışlı iseniz), try deyimi geri alınabilir öldürebilir önemli bir istisna durumunda kodunu çalıştırmak için fırsat verir.

Tamamen @ Jared Updike katılıyorum

Genellikle özel durum işleme hakkında çok az ya da hiçbir şey bilmeden kullanıcı ile yapılır. Öte yandan, sistemin kullanıcı ise-else blok içinde ne bilir.

örn. Onun dengesi düşük olduğunda bir ATM kullanıcıyı gösteren bir "başka" fıkra, mesaj "Yetersiz banka denge" olmalıdır. Ve bu mesaj herhangi bir nedenle bir "catch" bloğu içinde oturan EDİLEMEZ!