2011-11-23 3 views
1

나는 새 스레드를 생성하는 비 차단 기능 (즉시 반환) 일부 데이터를 구문 분석 할 수 있습니다콜백 함수를 처리 할 때 예외를 처리하는 일반적인 방법은 무엇입니까?

boost::any Parse() throw(ParseException) { 
    // parse something 
} 
typedef void (*HandlerFunc)(boost::any result); 
void ParseAsync(HandlerFunc handler) { 
    Parser me(*this); 
    in_new_thread { 
    boost::any result = me.Parse(); 
    handler(result); 
    } 
} 

문제는 Parse가 예외를 던질 수 있다는 것입니다. 이러한 예외를 처리하는 일반적인 C++ 방식은 무엇입니까? 어떤 식 으로든 핸들러 함수에 대한 예외를 "넘겨야합니까?"

+0

스레드 간 던지기는 새로운 C++ 11 표준에서만 다루어집니다. 그것은 오래된 C++의 일부가 아닙니다. –

+0

@Kerrek SB 다행히도 저는 C++ 11 코드를 작성하고 있습니다. –

+2

또한 예외 사양을 피하십시오 (정당한 이유로 C++ 11에서는 공식적으로 사용되지 않습니다). –

답변

8

새로운 C++ 11 표준은 스레드 프로그래밍을 쉽게하기위한 여러 가지 기능을 지원합니다.

가장 흥미로운 점은 std::futurestd::promise입니다.

std::promise::set_exception_* 기능에 유의하십시오. 이 클래스를 사용하면 원래 스레드 (예외 std::exception_ptr에 공유 포인터 의미 체계가 있음) 외부에서 예외를 전달할 수 있습니다. std::current_exception() (catch 문에서)을 사용하여 필요한 포인터를 얻을 수 있습니다.

다음은 std::future::get 함수에주의하십시오. promisefuture에서 추출한 값이 예외가 있으면 예외가 throw됩니다.

이것은 한 스레드에서 다른 스레드로 예외를 전달하는 메커니즘입니다.

1

마지막으로 내가 그런 식으로했을 때 예외 처리를 위해 std::exception const &을 수락 한 별도의 콜백 함수를 사용했습니다. 당신은 객체 수명에 조심해야합니다.

관련 문제