处理GetFolderAsync异常

时间:2017-07-18 12:33:09

标签: uwp c++-cx

我正在尝试遵循此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项目,以最小的设置测试代码,并且帖子顶部的代码确实有效。项目配置中必须有其他不同的东西。

1 个答案:

答案 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