2015-07-13 10 views

cevap

16

throw sadece rethrow yakalandı istisna nesnesi için bir catch ifadesi içinde kullanılmalıdır. Kodunuz, catch ifadesinin dışında kullanmaya çalışır - bunun yerine, atmak için bir tür seçmeniz gerekir. Şüpheniz varsa, std::runtime_error ile başlamak mantıksız değildir. Daha fazla seçenek için bkz. here. Kendi türlerinizi de atabilirsiniz, ancak bunları Standart kütüphane tarafından sağlanan türlerden birinden türetmek iyi bir fikirdir. Bu nedenle, müşteri kodunun yakalanması ve ele alınması yerine tüm mantıksal olarak benzer hatalar için uygun kullanımı belirleme şansı daha yüksektir. Onları ayrı ayrı ve her yeni olası hata için sürekli olarak güncellenir.

FWIW, Standart 15.1/9'unda söyler: istisna halen işlenen ise

, herhangi bir terimin bir taç ifade yürütme std::terminate() çağırır.

Çok açık bir şekilde, "Ne fırlatılıyor ..." yanıtı, fırlatma yapılmaması ve bunun yerine std::terminate çağrılmasıdır.

+3

Bu doğru, ancak soruya cevap veriyor mu? Haklı olarak "bunu yapma" deyin, ama "ne yaparsam yaparım?" Sorusu değil. – hvd

+0

@hvd: true ... tam metni bir araya getiriyordu .... –

+0

Evet, bu iyi görünüyor. :) – hvd

5

Yani soru şu: " bir catch bloğu dışında ne olur?" Buna cevabı onun documentation bulunabilir:

anda ele istisna Rethrows. Geçerli yakalama bloğunun yürütülmesini durdurur ve denetimi bir sonraki eşleşen özel durum işleyicisine aktarır (ancak aynı try bloğundan sonra başka bir yakalama maddesine geçmez: bileşik istisnasının "çıkıldı" olarak kabul edilir), varolan özel durum nesnesini yeniden kullanır: yeni nesne yapılmaz. Bu form yalnızca bir istisna şu anda ele alındığında izin verilir (aksi takdirde std :: sonlandırırsa). Bir işlev-try-bloğuyla ilişkili catch cümlesi, bir kurucuda kullanılıyorsa yeniden atma yoluyla çıkmalıdır.

Benimkini vurgular.

İlgili konular