簡體   English   中英

當異步函數拋出並且程序崩潰時,std :: future :: get()不捕獲異常

[英]std::future::get() does not catch the exception when the async function throws and program crashes

我試圖從使用std::async函數啟動的函數調用future::get()函數。 async函數中我拋出,以便我可以在future::get()調用中捕獲異常。 但是,我在get()調用中得到一個異常,該調用沒有在catch塊中捕獲,並且程序因unhandeld異常而崩潰。 我錯過了什么?

#include "stdafx.h"
#include <iostream>
#include <future>

void AsyncMethodThrowsExceptionTest();
void AsyncMethodThrowsException();

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    AsyncMethodThrowsExceptionTest();
    return 0;
}


void AsyncMethodThrowsExceptionTest()
{

    std::future<int> executionFuture;

    try
    {
        executionFuture = async(launch::async, AsyncMethodThrowsException);
    }
    catch(...)
    {
        cout << "caught ex [1]";
    }

    std::future_status::future_status status;

    status = executionFuture.wait_for(std::chrono::milliseconds(500u));
    if(status == std::future_status::deferred)
    {
        cout << "AsyncMethodThrowsException has not started";
    }
    else if(status == std::future_status::timeout)
    {
        cout << "AsyncMethodThrowsException timed out";
    }
    else if(status == std::future_status::ready)
    {
        cout << "AsyncMethodThrowsException successfully completed";
        try
        {
            if(executionFuture.valid())
            {
                executionFuture.get();
            }
        }
        catch(const std::future_error& ex)
        {
            cout << "AsyncMethodThrowsExceptionTest catch block";
        }
    }
}

void AsyncMethodThrowsException()
{
    throw(new exception("Exception from AsyncMethodThrowsException"));
}

你不僅在AsyncMethodThrowsException拋出一個指向std::exceptionAsyncMethodThrowsException (沒有理由這樣做),你們都捕獲對異常的引用而不是指針,以及對std::exception的子類的引用在那; std::future::get()拋出被調用函數拋出的確切異常,而不是std::future_error

還有一些其他語法問題:

  • std::future<int> executionFuture應該是std::future<void> executionFuture
  • std::future_status::future_status status應該是std::future_status status
  • std::exception沒有帶char const*std::string的構造char const* ,這可能是編譯器擴展。

總結一下:

#include <iostream>
#include <future>

void AsyncMethodThrowsExceptionTest();
void AsyncMethodThrowsException();

using namespace std;

int main()
{
  AsyncMethodThrowsExceptionTest();
}


void AsyncMethodThrowsExceptionTest()
{
  std::future<void> executionFuture;

  try
  {
    executionFuture = async(launch::async, AsyncMethodThrowsException);
  }
  catch (...)
  {
    cout << "caught ex [1]";
  }

  std::future_status status = executionFuture.wait_for(std::chrono::milliseconds(500u));
  if (status == std::future_status::deferred)
  {
    cout << "AsyncMethodThrowsException has not started";
  }
  else if (status == std::future_status::timeout)
  {
    cout << "AsyncMethodThrowsException timed out";
  }
  else if (status == std::future_status::ready)
  {
    cout << "AsyncMethodThrowsException successfully completed";
    try
    {
      if(executionFuture.valid())
      {
        executionFuture.get();
      }
    }
    catch(const std::exception& ex)
    {
      cout << "AsyncMethodThrowsExceptionTest catch block";
    }
  }
}

void AsyncMethodThrowsException()
{
  throw runtime_error("Exception from AsyncMethodThrowsException");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM