İlk 'ciddi' C ++ kütüphanemi tasarlarken kendime şunu soruyorum:
İstisnalardan türetmek iyi bir stil std::exceptionmi 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::exceptionsadece 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_exceptionsı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_exceptionsadece yakalayarak std::exceptionyakalayacağı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::exceptionsize 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.
catchsiteler 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::exceptionanlamına gelmez atmak birstd::exception. Ayrıca, ilk etaptastd::runtime_errormiras alırstd::exceptionvewhat()yöntemstd::exceptiondeğ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.