【Windows8开发】异步编程进阶篇之 Platform::Exception及task间的异常控制
先考虑下使用传统Thread API时,线程间的异常控制往往是一件相当痛苦的事情,由于某个线程的异常未捕获导致整个程序crash的情况也许很多人都碰到过。比如如果有一组任务链处理序列,我们往往需要对每个线程都详细考虑其可能抛出的各种异常,如果需要把一个异常从一个线程抛到另外一个线程进行处理时,那更需要多费很多周折,而且往往费时费力最后却还总是会发现这样那样的疏忽与漏洞。那WinRT提供的task有何不同呢?
在给出答案之前,先介绍下Metro程序中如何使用WinRT中定义Exception。WinRT中所有的异常都继承于Platform::Exception,比如ClassNotRegisteredException,FailureException,COMException等等。例如要抛出一个Failure的异常:
create_task([] { throw ref new Platform::Exception(E_FAIL);}).then([] (){ throw ref new Platform::Exception(E_FAIL);}).then([] (task<void> t){ try { t.get(); } catch (Platform::Exception^ e) { // handle the exception }});