我遇到以下代码示例的问题:
Windows::Storage::StorageFolder^ location = Package::Current->InstalledLocation;
try
{
task<StorageFile^> GetFileTask(location->GetFileAsync(sn));
GetFileTask.then([=](StorageFile^ file)
{
try
{
task<IBuffer^> ReadFileTask(FileIO::ReadBufferAsync(file));
ReadFileTask.then([=](IBuffer^ readBuffer)
{
// process file contents here
});
}
catch(Platform::Exception^ ex)
{
// Handle error here
}
});
}
catch(Platform::Exception^ ex)
{
// Handle error here
}
当使用不存在的文件名时,该函数会抛出异常:
GameTest2.exe中0x0FFCC531(msvcr110d.dll)的未处理异常:将无效参数传递给认为无效参数致命的函数。
我一直在网上搜索,这个例外只有在连接到调试器时才会中断。我正在使用VS 2012.我已经关闭了所有相关的'异常中断',但它仍然导致调试器中断,我的处理程序没有机会处理异常。
如果文件丢失,我希望GetFileAsync方法抛出“文件不存在”异常。不确定为什么它会一直抛出“无效参数”异常。
这开始让我烦恼,我找不到任何已知的解决方案。有人有什么想法吗?
我将尝试将方法更改为不使用任务&lt;&gt;码。相反,我将使用'await'调用GetFileAsync。但是我相信'await'只会导致调用线程等到GetFileAsync完成,这种情况会导致异步加载失败。
我想知道这是否是使用任务时异常处理的常见问题。
更新
好的,我现在找到了解决方案:
task<StorageFile^>( location->GetFileAsync(sn)).then([](StorageFile^ openedFile)
{
return FileIO::ReadBufferAsync(openedFile);
}).then([](IBuffer^ readBuffer)
{
// Process file
}).then([](task<void> t)
{
try
{
t.get();
}
catch(Platform::Exception^ e)
{
// Handle error
}
});
似乎需要在链的末尾添加一个额外的'then'条件来获取异常。