Yakalandığın şey, birinin kekini almaya ve onu da yemeye çalışan birinin cehennemi.
RAII ve istisnalar el ele gitmek üzere tasarlanmıştır. RAII sen yok ediliş biçimidir sahip bir sürü yazmaya catch(...)
temizlik yapmak için ifadeleri. Elbette, otomatik olarak gerçekleşecek. İstisnalar, RAII nesnelerle çalışmanın tek yoludur, çünkü yapıcılar yalnızca başarılı olabilir veya atabilir (veya nesneyi bir hata durumuna geçirebilir, ancak bunu kim ister?).
Bir catch
açıklama iki şeyden birini yapabilir: bir hatayı veya istisnai durumu ele alır veya temizleme işi yapar. Bazen her ikisini de yapar, ancak her catch
ifade bunlardan en az birini yapmak için vardır.
catch(...)
uygun istisna işlemleri yapamaz. Özel durumun ne olduğunu bilmiyorsunuz; istisna hakkında bilgi edemezsiniz. Bir istisnanın belirli bir kod bloğundaki bir şey tarafından atıldığı gerçeğinden başka hiçbir bilginiz yok . Böyle bir blokta yapabileceğiniz tek meşru şey, temizlik yapmaktır. Ve bu, temizliğin sonunda istisnayı tekrar atmak anlamına gelir.
RAII size istisnai durumlarla ilgili olarak size ücretsiz temizlik sağlar. Her şey RAII uygun şekilde kapsüllenmişse, her şey uygun şekilde temizlenir. Artık catch
ifadeleri temizleme işlemi yapmanız gerekmez. Bu durumda, bir catch(...)
ifade yazmak için hiçbir sebep yoktur .
Bu yüzden geçici olarak bunun catch(...)
kötü bir şey olduğuna katılıyorum .
Bu hüküm RAII'nin doğru kullanımıdır. Onsuz olduğundan, gerek bazı temizlik yapmak mümkün. Etrafında dolaşmak yok; temizlik işini yapabilmek zorundasın. Bir istisna atmanın kodu makul bir durumda bırakacağından emin olmanız gerekir. Ve catch(...)
bir olan hayati bunu yaparken de aracı.
Biri olmadan diğeri olamaz. Hem RAII hem catch(...)
de kötü olduğunu söyleyemezsiniz . Bunlardan en az birine ihtiyacınız var; Aksi takdirde, istisna güvende değilsindir.
Tabii ki, catch(...)
RAII'nin bile yasaklayamayacağı, nadiren geçerli bir kullanımı var : exception_ptr
başkasına iletmek. Tipik olarak bir promise/future
veya benzer bir arayüz aracılığıyla .
İş arkadaşlarım, hangi istisnaların atılacağını her zaman bilmeniz gerektiğini ve her zaman aşağıdaki gibi yapıları kullanabileceğinizi söylüyor:
İş arkadaşınız bir aptal (veya sadece korkunç derecede cahil). Bu, ne kadar kopyala ve yapıştır kodu yazmanızı önerdiği nedeniyle hemen anlaşılmalıdır. Bu açıklama ifadelerinin her biri için temizleme tamamen aynı olacaktır . Okunabilirlikten bahsetmiyorum bile, bu bir bakım kabusu.
Kısacası: Bu, RAII'nin çözmek için yarattığı problemdir (diğer problemleri çözmemesi değil).
Beni bu fikre karıştıran şey, genel olarak çoğu insanın RAII'nin kötü olduğunu iddia ettiği duruma ters yönde olmasıdır. Genel olarak, argüman "RAII kötüdür, çünkü yapıcı başarısızlığını işaret etmek için istisnalar kullanmak zorundasınız. Ancak istisnalar atamazsınız çünkü güvenli değil ve catch
her şeyi temizlemek için çok fazla ifadeniz olması gerekir ." Bu, bozuk bir argümandır çünkü RAII , RAII eksikliğinin yarattığı sorunu çözmektedir .
Muhtemelen, RAII'e karşı olduğu için ayrıntıları gizliyor. Yıkıcı çağrıları otomatik değişkenlerde hemen görünmez. Yani dolaylı olarak adlandırılan kodu alırsınız. Bazı programcılar bundan nefret ediyor. Görünüşe göre, catch
hepsi kopyala ve yapıştır koduyla aynı şeyi yapan 3 ifadeye sahip olduklarını düşündükleri noktaya göre daha iyi bir fikirdir.
...
ise benim soru odak" I daha iyi yakalamak Should "...
ya<specific exception>
yeniden atma önce"