Yanıtlar:
std::exception
tek amacı istisna hiyerarşisinde temel sınıf olarak hizmet etmek olan sınıftır. Başka kullanımı yoktur. Diğer bir deyişle, kavramsal olarak soyut bir sınıftır (terimin C ++ anlamında soyut sınıf olarak tanımlanmasa da).
std::runtime_error
std::exception
çeşitli çalışma zamanı hataları durumunda atılması amaçlanan daha özel bir sınıftır . Bunun ikili bir amacı vardır. Kendi başına fırlatılabilir veya daha özel çalışma zamanı hatası istisnaları std::range_error
, std::overflow_error
vb. İçin temel bir sınıf olarak hizmet std::runtime_error
edebilir. inen sınıflar std::exception
.
Tıpkı std::runtime_error
, standart kütüphane içeren std::logic_error
ayrıca inen, std::exception
.
Bu hiyerarşiye sahip olmanın amacı, kullanıcıya C ++ istisna işleme mekanizmasının tam gücünü kullanma fırsatı vermektir. 'Catch' cümlesi polimorfik istisnaları yakalayabildiğinden, kullanıcı istisna hiyerarşisinin belirli bir alt ağacından istisna türlerini yakalayabilen 'catch' cümleleri yazabilir. Örneğin, alt ağaçtan catch (std::runtime_error& e)
tüm istisnaları yakalayarak std::runtime_error
diğerlerinin geçmesine izin verir (ve çağrı yığınında daha da yukarı uçar).
PS Yararlı bir istisna sınıfı hiyerarşisi tasarlamak (kodunuzun her noktasında yalnızca ilgilendiğiniz istisna türlerini yakalamanıza izin verir) önemsiz olmayan bir görevdir. Standart C ++ kitaplığında gördüğünüz şey, dilin yazarları tarafından size sunulan olası bir yaklaşımdır. Gördüğünüz gibi, tüm istisna türlerini "çalışma zamanı hataları" ve "mantık hataları" olarak ayırmaya karar verdiler ve oradan kendi istisna türlerinizle devam etmenize izin verdiler. Elbette, bu hiyerarşiyi yapılandırmanın, tasarımınıza daha uygun olabilecek alternatif yolları vardır.
Güncelleme: Taşınabilirlik Linux vs Windows
Loki Astari ve unixman83'ün aşağıdaki cevaplarında ve yorumlarında belirttiği gibi, exception
sınıfın kurucusu C ++ standardına göre herhangi bir argüman almaz. Microsoft C ++, exception
sınıfta bağımsız değişkenler alan bir oluşturucuya sahiptir , ancak bu standart değildir. runtime_error
Sınıfı bir yapıcı alma argümanları (sahip char*
iki platformda, Windows ve Linux işletim sistemlerinde). Taşınabilir olmak için daha iyi kullanın runtime_error
.
(Unutmayın, projenizin bir özelliği kodunuzun Linux'ta çalışması gerekmediğini söylediği için, hiçbir zaman Linux'ta çalışması gerekmediği anlamına gelmez.)
std::exception
. Elbette, her std
şey bunun türetilmiş sınıflarını atar, ancak yalnızca std::exception
türetilmiş nesneleri fırlatmak için kesinlikle hiçbir neden yoktur .
std::exception
standart istisna hiyerarşisinin soyut temeli olarak düşünülmelidir (dikkate alınmalıdır). Bunun nedeni, belirli bir mesajı iletecek bir mekanizmanın olmamasıdır (bunu yapmak için türetmeli ve uzmanlaşmalısınız what()
). Std :: exception'ı kullanmaktan sizi alıkoyacak hiçbir şey yoktur ve basit uygulamalar için ihtiyacınız olan tek şey bu olabilir.
std::runtime_error
diğer yandan bir dizgeyi mesaj olarak kabul eden geçerli kuruculara sahiptir. Tüm what()
olarak adlandırılan bir const char işaretçi döndürülür yapıcı içine geçirildi aynı dize sahip olan bir Cı-dizge noktaları.
try
{
if (badThingHappened)
{
throw std::runtime_error("Something Bad happened here");
}
}
catch(std::exception const& e)
{
std::cout << "Exception: " << e.what() << "\n";
}
std::exception(std::string)
. Şimdi, kodumun std::runtime_error
Linux'ta (GCC) çalışmasını istiyorsam atmam gerektiğini anlıyorum.