W przypadku niektórych kodu wielowątkowego chciałbym przechwycić wszystkie wyjątki i przekazać je do pojedynczego wątku obsługi wyjątku. Oto wiadomość przechodząc ramy:Czy wyjątki można "duplikować" za pomocą wskaźników wyjątku?
#include <exception>
struct message
{
virtual ~message() = default;
virtual void act() = 0;
};
struct exception_message : message
{
std::exception_ptr ep;
virtual void act()
{
std::rethrow_exception(ep);
}
// ...
};
oto przypadek użycia:
try
{
// ...
}
catch (...)
{
exception_message em { std::current_exception(); }
handler_thread.post_message(em);
}
Gwint obsługi przechodzi przez wszystkie jego wiadomości i wzywa act()
i można go zainstalować własny blok try/catch, aby obsłużyć wszystkie opublikowane wyjątki.
Teraz zastanawiałem się, co się stanie, jeśli wyślę kopie tej wiadomości do wielu odbiorców. Ogólnie rzecz biorąc, może istnieć dowolna liczba adresatów, więc nie chcę nakładać arbitralnych ograniczeń na wiadomości o wyjątkach. exception_ptr
jest udokumentowany jako inteligentny wskaźnik "współwłasności", a rethrow_exception
"nie wprowadza wyścigu danych".
Moje pytanie: Czy uzasadnione jest powielanie aktywnego wyjątku przez przechowywanie go w postaci exception_ptr
, kopiowanie przy użyciu wskaźnika i wielokrotne wywoływanie ?
wystarczy znaleźć pod adresem google: http://msdn.microsoft.com/en-us/library/dd293602.aspx "Transportowanie wyjątków między wątkami" – PiotrNycz
Nigdy nie próbowałem czegoś takiego. Skopiowanie/zgłoszenie wyjątku do innego wątku i ponowne jego podniesienie wydaje się nieco dziwne, ponieważ po otrzymaniu wyjątku utracił on cały kontekst. oryginalny wątek, z wyjątkiem tego, co zawiera. Sprawdzając zasygnalizowany wyjątek w jednym wątku i być może rejestrując go lub cokolwiek innego, mogłem zrozumieć. –
@PiotrNycz: Ta strona nie jest w C++. Nie ma 'std :: copy_exception' w C++, –