2016-12-22 13 views
2

두 작업 모두 예외를 throw 할 수있는 && operator 작업을 사용하여 두 가지 pplx 작업에 참가하려고합니다.카사 블랑카에서 여러 작업의 예외를 잡는 방법

나는 ppl documentation에서 최종 작업 기반 연속에서 예외를 잡을 수 있음을 알고 있습니다. 이것은 카사 블랑카에서도 잘 작동합니다. 그러나 마지막 단 하나의 예외 만 잡을 수 있습니다. 두 하위 작업이 모두 처리되면 하나는 처리되지 않은 상태로 남습니다.

여기 내 문제를 설명하기위한 최소한의 예입니다 :

#include <pplx/pplxtasks.h> 
#include <iostream> 

int main(int argc, char *argv[]) 
{ 
    int a = 0; int b = 0; 

    auto t1 = pplx::create_task([a] { return a+1; }) 
    .then([](int a) { throw std::runtime_error("a"); 
         return a+1; }); 

    auto t2 = pplx::create_task([b] { return b+1; }) 
    .then([](int b) { throw std::runtime_error("b"); 
         return b+1; }); 

    (t1 && t2) 
    .then([] (std::vector<int>) { /*...*/ }) 
    .then([] (pplx::task<void> prev) { 
     try { 
      prev.get(); 
     } catch (std::runtime_error e) { 
      std::cout << "caught " << e.what() << std::endl; 
     } 
    }); 

    std::cin.get(); 
} 

은 try/캐치 먼저 발생하는 두 가지 예외의 어느 잡을 수있다. 어떻게 다른 걸 잡을 수 있니?

답변

1

각 작업에 최종 작업 기반 연속을 추가해야합니다. 그러나 예외를 catch하는 것은 다시 던질 것을 제안합니다. 그러나 연속 작업에서는 두 예외가 동일하다는 것을 알지 못하기 때문에 잘못된 아이디어 일 수 있습니다.
출력 :


는 또한

b를 최종 잡은 적발 당신이 잠을 제거하면, 당신은 "추적/중단 점 트랩"예외를 받게됩니다 잡았다.

#include <pplx/pplxtasks.h> 
#include <iostream> 

int main(int argc, char *argv[]) 
{ 
    int a = 0; int b = 2; 

    auto t1 = pplx::create_task([a] { return a+1; }) 
    .then([](int a) { throw std::runtime_error("a"); return a+1; }) 
    .then([] (pplx::task<int> prev) 
    { 
     int retVal = -1; 
     try 
     { 
      retVal = prev.get(); 
     } 
     catch (std::runtime_error e) 
     { 
      std::cout << "caught " << e.what() << std::endl; 
      throw e; 
     } 

     return retVal; 
    }); 

    auto t2 = pplx::create_task([b] { return b+1; }) 
    .then([](int b) { throw std::runtime_error("b"); return b+1; }) 
    .then([] (pplx::task<int> prev) 
    { 
     int retVal = -1; 
     try 
     { 
      sleep(1); 
      retVal = prev.get(); 
     } 
     catch (std::runtime_error e) 
     { 
      std::cout << "caught " << e.what() << std::endl; 
      throw e; 
     } 

     return retVal; 
    }); 

    (t1 && t2) 
    .then([] (std::vector<int> v) { for(int i : v) { std::cout << i << std::endl; } }) 
    .then([] (pplx::task<void> prev) 
    { 
     try 
     { 
      prev.get(); 
     } 
     catch (std::runtime_error e) 
     { 
      std::cout << "caught final " << e.what() << std::endl; 
     } 
    }).get(); 
}