fork download
  1. #include <iostream>
  2. #include <cstdlib>
  3. //---------------------------------------------------------------------------
  4. #include <future>
  5. #include <stdexcept>
  6. //------------------------------------------------------------------------------
  7. std::future<int> test_future_error1()
  8. {
  9. std::promise<int> prom;
  10. std::future<int> fu = prom.get_future();
  11.  
  12. prom.set_value(5566);
  13.  
  14. return fu;
  15. }
  16. //---------------------------------------------------------------
  17. std::future<int> test_future_error2()
  18. {
  19. std::promise<int> prom;
  20. std::future<int> fu = prom.get_future();
  21. std::future<int> fu2 = prom.get_future(); // throw std::future_errc::future_already_retrieved
  22.  
  23. prom.set_value(5566);
  24.  
  25. return fu;
  26. }
  27. //---------------------------------------------------------------
  28. std::future<int> test_future_error3()
  29. {
  30. std::promise<int> prom;
  31. std::future<int> fu = prom.get_future();
  32.  
  33. prom.set_value(5566);
  34. prom.set_value(7788); // throw std::future_errc::promise_already_satisfied
  35.  
  36. return fu;
  37. }
  38. //---------------------------------------------------------------
  39. std::future<int> test_future_error4()
  40. {
  41. std::promise<int> prom;
  42. std::future<int> fu = prom.get_future();
  43.  
  44. return fu;
  45. } // throw std::future_errc::broken_promise at fu.get()
  46. //---------------------------------------------------------------
  47. std::future<int> test_future_error5()
  48. {
  49. std::future<int> fu;
  50.  
  51. return fu;
  52. } // throw std::future_errc::no_state at fu.get()
  53. //---------------------------------------------------------------
  54. int main()
  55. {
  56. try {
  57.  
  58. std::future<int> fu = test_future_error3();
  59. int a = fu.get();
  60.  
  61. std::cout << "a= " << a << std::endl;
  62. } catch(const std::future_error &e) {
  63.  
  64. std::cout << "future_error:" << std::endl;
  65. if( e.code() == std::future_errc::broken_promise )
  66. std::cout << "code() == std::future_errc::broken_promise" << std::endl;
  67. else if( e.code() == std::future_errc::future_already_retrieved )
  68. std::cout << "code() == std::future_errc::future_already_retrieved" << std::endl;
  69. else if( e.code() == std::future_errc::promise_already_satisfied )
  70. std::cout << "code() == std::future_errc::promise_already_satisfied" << std::endl;
  71. else if( e.code() == std::future_errc::no_state )
  72. std::cout << "code() == std::future_errc::no_state" << std::endl;
  73. else
  74. std::cout << "code() == unknown" << std::endl;
  75. std::cout << "what() == " << e.what() << std::endl;
  76.  
  77. } catch(const std::exception &e) {
  78. std::cout << "excepton: " << e.what() << std::endl;
  79. }
  80.  
  81. return 0;
  82. }
  83.  
  84.  
Success #stdin #stdout 0s 3000KB
stdin
Standard input is empty
stdout
excepton: Unknown error 4294967295