我打算使用以下代码下载文件。当WIFI可用时它可以工作;但是当没有Wifi时,我希望能够抓住previousTask.get()
中提出的异常。不幸的是,我的代码中的catch
似乎没有抓住异常。顺便说一句,例外是HRESULT:0x80072F30 The text associated with this error code could not be found.
。我错过了一些例外情况是不可原谅的吗?
auto httpClient = ref new HttpClient();
auto get_operation = httpClient->GetAsync(ref new Uri(url), HttpCompletionOption::ResponseContentRead);
get_operation->Progress = progressHandler;
auto response = create_task(get_operation).then([](task<HttpResponseMessage^> previousTask)
{
try
{
return previousTask.get();
}
catch (Exception^ ex)
{
// Some how this does not catch
OutputDebugString(("Exception: " + ex->Message)->Data());
return (HttpResponseMessage^)nullptr;
}
}).get();
// At this point, I expect either a fully read response or response=nullptr
// Code to write to file is omitted
编辑:~~我测试了显然使用类似代码的官方微软HttpClient sample。显然,当没有网络连接时,该应用程序会发生同样的崩溃。这种方式证实了缺陷是在操作系统方面,而且没有人能做到这一点。~~
编辑:事实证明我认为异常没有被捕获,因为Visual Studio弹出一个对话框,我认为这意味着实际上异常会崩溃应用程序,即它不是通过VS启动时。我仔细阅读了弹出消息并意识到VS会在每次抛出异常时提示,除非配置不这样做;按对话框上的[继续]按钮转到catch
子句。从“开始”菜单启动应用程序没有任何问题。
答案 0 :(得分:3)
如果从UI线程调用此代码,则从此代码的最后一行删除get()
调用。你不能在UI线程中这样做。
否则,在启用飞行模式的情况下,您的代码可以正常工作;正如预期的那样,我在处理程序中捕获异常。例外HResult
0x80072f30
,MSDN page记录为 ERROR_WINHTTP_NO_CM_CONNECTION