none
C++ REST SDK 遇到“_REPORT_PPLTASK_UNOBSERVED_EXCEPTION”未处理异常 RRS feed

  • 问题

  • try
    		{
    			auto response = client.request(methods::POST, builder.to_string(), strPostData2, L"application/json").then([](http_response response)
    			{
    				if ( response.status_code() == status_codes::OK )
    				{
    					try
    					{
    						std::wstring obj1 = response.extract_string().get();
    						rapidjson::Document doc;
    						doc.Parse<0>(WChar2Ansi(obj1.c_str()).c_str());
    						if ( doc.GetParseError() )
    						{
    							return -1;
    						}
    						std::string strError = getDataValueStr(&doc,"error");
    						std::string strMsg = getDataValueStr(&doc,"msg");
    						//提示消息
    						TCHAR szDescribe[128]=TEXT("");
    						_sntprintf(szDescribe,CountArray(szDescribe),TEXT("收到rank/setscore 响应消息 msg:%s"), strError.c_str());
    						CTraceService::TraceString(szDescribe,TraceLevel_Warning);
    						return 0;
    					}
    					catch (const http_exception& e)
    					{
    						std::cout << e.what() << std::endl;
    					}
    				}
    			}).then([](...){});
    		}
    		catch (const std::system_error& e)
    		{
    			std::cout << e.code() << e.what() << std::endl;
    			return -1;
    		}
    		catch (const std::exception& e)
    		{
    			std::cout << e.what() << std::endl;
    			return -1;
    		}
    		catch(...)
    		{
    			//...
    			return -1;
    		}
    		
    		return 0;

    如果这里不阻塞的使用then,那么访问一个不可达地址时,就无法捕捉异常,报一个_REPORT_PPLTASK_UNOBSERVED_EXCEPTION的问题。而使用get方法阻塞在这里,又不是我的初衷。因为这段代码时写在服务器

    线程中,可能有很多任务等待处理,我阻塞在这里等待response,很影响我的服务器效率。

      
    2017年10月18日 23:39

全部回复

  • Hi,

    感谢在MSDN论坛发帖。

    >>如果这里不阻塞的使用then,那么访问一个不可达地址时,就无法捕捉异常,报一个_REPORT_PPLTASK_UNOBSERVED_EXCEPTION的问题。而使用get方法阻塞在这里,又不是我的初衷。因为这段代码时写在服务器线程中,可能有很多任务等待处理,我阻塞在这里等待response,很影响我的服务器效率。

    对于这种情况,我建议你在你的任务执行完成后,添加task-based continuation(基于任务的延续代码)。

    基于任务的延续使你能够处理由先行任务抛出的任何异常。基于任务的延续总是运行,任务是否成功完成,抛出异常或被取消无关紧要。当一个任务抛出一个异常时,它的基于任务的延续被安排运行。任务有两个延续;一个是基于价的,另一个是基于任务的。基于任务的异常总是运行,因此可以捕获由先行任务抛出的异常。当示例等待两个延续完成时,再次抛出异常。

    关于更多详细内容和实例,你可以参考以下文档。

    https://msdn.microsoft.com/en-us/library/dd997692.aspx#Anchor_2

    希望对你有所帮助。

    Best Regards,
    Sera Yu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年10月19日 8:03