tous
J'étais entrain de rédiger une partie pour http://www.open-std.org/jtc1/sc22/wg...007/n2179.html pour le tuto sur le C++11. Comme je suis pas exception-proof (Qt inside) je me demandais :
* l'intérêt de ce genre de chose est bien de pouvoir traiter une exception lancée dans un thread dans un autre thread ?
* peut-on le faire sans ça ?
* comment en faisant avant ?
Perso, je traitais l'exception dans le thread qui lance l'exception et en gros, c'est tout (retour erreur ou variable membre error)
Avec la nouvelle norme, on a ça :
Des remarques sur ce code ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 #include <iostream> #include <exception> #include <stdexcept> #define USE_THREAD_BOOST #ifdef USE_THREAD_BOOST #include <boost/thread.hpp> using boost::thread; #else #include <thread> using std::thread; #endif using std::cout; using std::endl; struct Task { void operator() () { try { // big work std::string().at(1); } catch(...) { e = std::current_exception(); // on récupère l'exception } } std::exception_ptr e = nullptr; }; int main () { cout << "Lancement du thread" << endl; Task tk; thread th(boost::ref(tk)); th.join(); try { if (tk.e != nullptr) { // ou : e != std::exception_ptr() std::rethrow_exception(tk.e); // relance l'exception } } catch(const std::exception& e) { std::cout << "Exception lancée dans le thread : " << e.what() << std::endl; } return 0; }
Merci
Partager