2011-12-12 11 views
19

Standart, referans olarak yakalanan bir istisna ve onu değiştirme girişimlerine ne olacağı hakkında söyleyecek bir şey var mı?Referans ile bir istisna yakalarsanız, onu değiştirebilir ve yeniden düzenleyebilir misiniz?

Aşağıdaki kodu düşünün:

class my_exception: public std::logic_error 
{ 
public: 
    std::vector<std::string> callstack; 
}; 

void MyFunc() 
{ 
    try 
    { 
     SomethingThatThrows(); 
    } 
    catch (my_exception & e) 
    { 
     e.callstack.push_back("MyFunc"); 
     throw; 
    } 
} 

Bu zoraki bir örnektir, ben aslında böyle bir şey denemeden değilim. Başka bir iş parçacığındaki öneriye dayanarak ne olacağını merak ettim, istisnalar const referansı ile yakalanmalı.

+1

boost :: istisna bunun için bazı düzgün araçlara sahiptir. –

+1

push_back atabilir. Dize kurucu kopyalayabilir. Bugün std :: array what_msg istisnasını tercih ederim. Böylece sanal olanı kolayca uygulayabilirsiniz. – Muxecoid

cevap

20

Kural dışı durum değişecektir.

§15.3 [except.handle]/17: işleyicisi, bu nesne için bir değişiklik atımı yürütülmesi ile başlatıldı geçici nesne etkilemez sabit olmayan bir nesne bildirir

-Anlatım. atmak ifade idam edildi ve bu nesne rethrown edilmelidir etkisi olmayacaktır zaman

işleyicisi bir başvuru olmayan bir sabit nesne beyan, başvurulan nesne herhangi bir değişiklik geçici nesneye değişiklikler başlatılır. my_exceptionMyFunc dışında yakalanması halinde

Demek ki çağrı yığını "MyFunc" giriş göreceksiniz (örn http://ideone.com/5ytqN)

10

Evet, bunu yapabilirsiniz. Geçerli istisnayı throw; kullanarak yeniden kullandığınızda, kopya alınmaz: özgün geçici özel durum nesnesi yeniden çizilir. Bu nedenle, işleyicide bu nesneye yaptığınız değişiklikler, bir sonraki yakalamada istisna nesnesi içinde mevcut olacaktır.

İlgili konular