我正在尝试遵循此answer中的相同结构来处理异步任务中的异常。在这种情况下,来自GetFolderAsync
的{{1}}。
FutureAccessList
但是从VS2015调试模式运行它仍然会崩溃并显示以下消息
WinRT信息:与指定关联的文件或文件夹 无法找到令牌(PickedFolderToken)。文件或文件夹可能有 被移动或删除。
如果存在此异常的处理程序,则程序可能是安全的 继续进行。
如果我尝试继续它,就会不断抛出异常。我错过了什么?
更新
在以下代码中尝试使用if (Windows::Storage::AccessCache::StorageApplicationPermissions::FutureAccessList->ContainsItem("PickedFolderToken")) {
create_task(Windows::Storage::AccessCache::StorageApplicationPermissions::FutureAccessList->GetFolderAsync("PickedFolderToken")).then([this](StorageFolder^ folder)
{
//do some stuff
auto query = folder->CreateFileQueryWithOptions(Q);
return query->GetFilesAsync();
}).then([this](IVectorView<StorageFile^>^ f)
{
// Process
}).then([this](task<void> t)
{
try
{
t.get();
}
catch (Platform::Exception^ e)
{
// Handle error
txt_currentPath->Text = "FOLDER NOT FOUND";
}
});
}
和try
仍然会引发异常......
catch
UPDATE2:
典型使用场景:
- 用户打开应用程序。选择要在应用内打开的文件夹,例如C:\数据集\集1。该路径作为“PickedFolderToken”存储在FutureAccessList中
- 用户完成并退出程序
- 稍后,他们再次启动程序,它会自动导航到FutureAccessList中存储的文件夹“PickedFolderToken”。
例外情况:
- 文件夹“C:\ datasets \ set1”现已删除或不再可用(可能指向SD卡E:\ datasets \ set1)在应用程序之外
- 用户启动应用程序并崩溃&lt; - 这是我正在尝试处理的例外
try {
Windows::Storage::AccessCache::StorageApplicationPermissions::FutureAccessList->GetFolderAsync("PickedFolderToken");
}
catch (Exception^ e){
OutputDebugString(L"ERROR");
}
由于令牌字符串仍然存在于if (FutureAccessList->ContainsItem("PickedFolderToken"))
中,会按预期返回true。问题顶部的代码不会捕获FutureAccessList
抛出的异常。
UPDATE3:
我创建了一个空白的UWP项目,以最小的设置测试代码,并且帖子顶部的代码确实有效。项目配置中必须有其他不同的东西。
答案 0 :(得分:0)
WinRT信息:找不到与指定令牌(PickedFolderToken)关联的文件或文件夹。文件或文件夹可能已被移动或删除。 如果存在此异常的处理程序,则可以安全地继续该程序。
上面的错误信息描述得非常清楚。要解决此问题,您可以使用&#34; PickedFolderToken&#34;将文件夹添加到FutureAccessList
。您可以参考以下代码。
FolderPicker^ folderPicker = ref new FolderPicker();
folderPicker->SuggestedStartLocation = PickerLocationId::Desktop;
folderPicker->FileTypeFilter->Append("*");
create_task(folderPicker->PickSingleFolderAsync()).then([this](StorageFolder^ folder)
{
if (folder)
{
Windows::Storage::AccessCache::StorageApplicationPermissions::
FutureAccessList->AddOrReplace("PickedFolderToken", folder);
}
else
{
}
});
<强>更新强>
典型使用场景: - 用户打开应用程序。选择要在应用内打开的文件夹,例如&GT; C:\数据集\ SET1。该路径作为&gt;&#34; PickedFolderToken&#34;存储在FutureAccessList中。 - 用户完成并退出程序。 - 稍后,他们再次启动程序,它会自动导航到FutureAccessList中存储的&gt;文件夹,作为&#34; PickedFolderToken&#34;。
例外情况: - 文件夹&#34; C:\ datasets \ set1&#34;现已删除或不再可用 (也许它指向应用程序之外的SD卡E:\ datasets \ set1) - 用户启动应用程序并崩溃&lt; - 这是我尝试&gt;尝试处理的例外
要处理任务链中的错误,您不必将每个延续任务都放在任务中,或者包含可能在try ... catch块中抛出的每个操作。相反,您可以在链的末尾添加基于任务的延续并处理其中的所有错误。有关更多信息,请参阅Handling errors in a task chain。