2015-06-01 15 views
5

std::exception_ptr içinde saklanan bir özel durum var. std::rethrow_exception kullanarak istisnayı yeniden yapıyorum, catch(MyException&) kullanarak erişiyorum ve sonra değeri değiştiriyorum.Bir std :: exception_ptr içindeki bir istisnanın değerini değiştirebilir miyim?

Aynı istisnayı tekrar atarsam, yaptığım değişikliklere uymalı mıyım?

#include <exception> 
#include <iostream> 

struct MyException { 
    int value; 
}; 

int main() { 
    std::exception_ptr a = std::make_exception_ptr(MyException()); 

    try { 
     std::rethrow_exception(a); 
    } catch(MyException& b) { 
     std::cout << b.value << std::endl; 
     b.value = 3; 
    } 

    try { 
     std::rethrow_exception(a); 
    } catch(MyException& b) { 
     std::cout << b.value << std::endl; 
    } 
} 
+0

Değişikliği gözlemleyerek ne demek istiyorsunuz? – perencia

+0

@perencia Aynı istisnayı yeniden kullanırsam, yaptığım değişiklikler olurdu. Benim kod örneğimde, ikinci atayım 'a'' 3'''' '' '' '' '' dır. –

+0

Örnekte, her zaman aynı nesneyi kullanarak, referans alarak yakalayın. – perencia

cevap

6

Kodunuz uygun ve taşınabilir olduğu:

Aşağıdaki kod benim fikrim gösterir. Burada Ama orada ejderha:

  • Eğer senin exception_ptrcurrent_exception() aracılığıyla, o anki istisna bir kopyası veya geçerli istisna kendisi için bir referans bir başvuru almak ister belirtilmemiş ise elde edin. Bir satırda iki kez current_exception() arasanız bile, aynı özel durum nesnesine başvuruda bulunabilirsiniz veya olmayabilir. exception_ptr yana

  • copyable ve kopya aynı durum nesneye gelin ve rethrow_exception bir kopyasını yapmaz olabilir, iki iş parçacığı aynı anda aynı istisna nesnesini atmak için oldukça mümkündür. Yani çok iş parçacıklı bir programda, bir catch yan tümcesi içinde bir özel duruma benzersiz erişiminiz olup olmadığını bilmek çok zor olabilir. Bu istisna ile ilgili değişiklikler bir veri yarışması oluşturabilir. Bu veri yarışması, current_exception()'un bir kopyasını oluşturup oluşturmayacağına bağlı olarak, bazı platformlarda ve başkalarında bulunmayabilir. Bir çok kanallı programda bir istisna nesneyi değiştirmek gerekiyorsa

Yani, ilk kopyalamak kopya değiştirmek ve (gerekirse) sonra kopyayı yeniden atmanızı güvenli yoldur.

GÜNCELLEME

Üzgünüm, yanlış bir cevap verdik. Kullanılması

: http://webcompiler.cloudapp.net örnek kod çıktıdır:

0 
0 

rethrow_exception VS uygulaması istisna bir kopyasını yapmak için görünür.

Clang ve gcc kopya oluşturmuyor.

+0

Bu nedenle, yeniden biçimlendirme istisnasında bir kopya olamaz? – Yakk

+1

@Yakk: Bu, [yayılım]/p10 okuduğum yol: * Atar: * 'p' ifadesinin kullanıldığı istisna nesnesi. Tersine, current_exception() işlevini tanımlarken p8, belirtilmemiş kopya semantiklerini tanımlarken büyük uzunluklara gider. –

+0

Cevabınıza dayanarak, cevabı http://stackoverflow.com/questions/30462906/is-it-safe-to-use-an-exception-outside-the-catch-statement-if-it- adresinden çıkarabilir miyim? bir-in-a-st "Evet. bu güvenli"? –

İlgili konular