İlk 'ciddi' C ++ kütüphanemi tasarlarken kendime şunu soruyorum:
İstisnalardan türetmek iyi bir stil std::exception
mi ve yavruları mı ?!
Okuduktan sonra bile
Hala emin değilim. Çünkü, yaygın (ama belki de iyi değil) uygulamaların yanı sıra, bir kütüphane kullanıcısı olarak, bir kütüphane fonksiyonunun std::exception
sadece kütüphane uygulamasında standart kütüphane fonksiyonları başarısız olduğunda ve bu konuda hiçbir şey yapamadığını varsayarım . Ama yine de, uygulama kodu yazarken, benim için çok uygun ve aynı zamanda sadece bir atmak isteyen IMHO iyi std::runtime_error
. Ayrıca kullanıcılarım, what()
kodlar gibi tanımlanmış minimum arabirime de güvenebilir .
Örneğin, kullanıcım hatalı argümanlar sunuyor, atmaktan daha uygun ne olurdu std::invalid_argument
, değil mi? Bu yüzden başkalarının kodunda görmek std :: istisna henüz yaygın kullanımı ile birlikte: Neden daha ileri gitmek ve özel istisna sınıf (örneğin lib_foo_exception) ve ayrıca türetmek değil std::exception
.
Düşünceler?
lib_foo_exception
sınıfımdan türetildiğinde std::exception
, kütüphane kullanıcısının sadece liberal olanı yakalamanın yanı sıra, lib_foo_exception
sadece yakalayarak std::exception
yakalayacağıdır. Bu yüzden benim kütüphane istisna kök sınıf std :: istisna miras gerekir .
lib_foo_exception
?" Devralan ile std::exception
size gösterip yapabilirsiniz catch(std::exception)
VEYA tarafından catch(lib_foo_exception)
. Doğan olmadan std::exception
, bunu yakalamak istiyorsunuz ancak ve ancak yoluyla, catch(lib_foo_exception)
.
catch(...)
. Oradadır, çünkü dil düşündüğünüz vakaya (ve "yanlış davranış" kütüphanelerine) izin verir, ancak bu modern en iyi uygulama değildir.
catch
siteler ve aynı şekilde bir kullanıcı sonu operasyonunu modelleyen daha kaba işlemleri teşvik etme eğilimindedir . Genelleştirilmiş yakalama fikrini teşvik etmeyen dillerle karşılaştırırsanız std::exception&
, örneğin, try/catch
çok özel hatalarla ilgili olan ara bloklarla çok daha fazla kodları vardır , bu da yerleştirmeye başlarken istisna işlemenin genelliğini bir miktar azaltır. manuel hata işleme ve ayrıca olası tüm farklı hatalara daha güçlü bir vurgu.
std::exception
anlamına gelmez atmak birstd::exception
. Ayrıca, ilk etaptastd::runtime_error
miras alırstd::exception
vewhat()
yöntemstd::exception
değil, gelirstd::runtime_error
. Ve böyle genel istisnalar atmak yerine kesinlikle kendi istisna sınıflarınızı yaratmalısınızstd::runtime_error
.