2017-07-18 5 views
0

Ich versuche, die gleiche Struktur von diesem answer zu folgen, um Ausnahmen von asynchronen Aufgaben zu behandeln. In diesem Fall GetFolderAsync von der FutureAccessList.Handle GetFolderAsync Ausnahmen

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"; 
     } 
    }); 
} 

Aber läuft von VS2015 Debug-Modus mit der folgenden Meldung noch

WinRT Informationen stürzt ab: Die Datei oder einen Ordner mit dem angegebenen Token (PickedFolderToken) nicht gefunden werden kann assoziiert. Möglicherweise wurde die Datei oder der Ordner verschoben oder gelöscht.

Wenn es einen Handler für diese Ausnahme gibt, kann das Programm sicher fortgesetzt werden fortgesetzt.

Wenn ich versuche fortzufahren, wird nur eine Ausnahme ausgelöst. Was vermisse ich?

Update:

mit try und catch im folgenden Code Experimenting wirft nach wie vor eine Ausnahme ...

try { 
Windows::Storage::AccessCache::StorageApplicationPermissions::FutureAccessList->GetFolderAsync("PickedFolderToken"); 
} 
catch (Exception^ e){ 
    OutputDebugString(L"ERROR"); 
} 

Update2:

Typisches Einsatzszenario:
- Benutzer öffnet die App. Wählt einen Ordner aus, der in der App geöffnet werden soll, z. C: \ Datasets \ set1. Der Pfad wird in FutureAccessList als "PickedFolderToken" gespeichert.
- Der Benutzer beendet und beendet das Programm.
- Später starten sie das Programm erneut und es navigiert automatisch zu dem Ordner, der in der FutureAccessList als "PickedFolderToken" gespeichert ist.

Ausnahmefall:
- Der Ordner "C: \ Datensätze \ set1" wird nun gelöscht oder nicht wurde mehr verfügbar (vielleicht ist es auf eine SD-Karte E hingewiesen: \ Datensätze \ set1) außerhalb der App
- Benutzer starten die App und stürzt < - das ist die Ausnahme ich versuche

if (FutureAccessList->ContainsItem("PickedFolderToken")) 

true zurück zu handhaben wie erwartet als der Token-String in den FutureAccessList noch vorhanden ist. Der Code oben in der Frage fängt nicht die Ausnahme ab, die von GetFolderAsync ausgelöst wird.

Update3:
Ich habe ein leeres UWP-Projekt den Code in einer minimalen Einstellung und den Code an der Spitze der Post zu testen, funktioniert tatsächlich. Es muss etwas anderes in der Projektkonfiguration geben.

+0

Der Aufruf get() gibt das gewünschte IVectorView zurück. Oder löst die Ausnahme aus. Also sollte die Sekunde dann() nicht da sein. –

Antwort

0

WinRT-Information: Die Datei oder der Ordner, der dem angegebenen Token (PickedFolderToken) zugeordnet ist, kann nicht gefunden werden. Die Datei oder der Ordner wurde möglicherweise verschoben oder gelöscht. Wenn für diese Ausnahme ein Handler vorhanden ist, kann das Programm sicher fortgesetzt werden.

Die obige Fehlermeldung wird sehr deutlich beschrieben.Um dieses Problem zu lösen, können Sie den Ordner FutureAccessList mit "PickedFolderToken" hinzufügen. Sie könnten auf den folgenden Code verweisen.

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 
    { 

    } 
}); 

Update:

Typisches Einsatzszenario: - Benutzer öffnet die App. Wählt einen Ordner aus, der in der App geöffnet werden soll, z. > C: \ Datasets \ set1. Der Pfad wird in FutureAccessList als> PickedFolderToken , der in der FutureAccessList als "PickedFolderToken" gespeichert ist.

Ausnahmefall: - Der Ordner „C: \ Datensätze \ set1“ länger verfügbar gelöscht oder nicht jetzt wurde (vielleicht ist es auf eine SD-Karte E hingewiesen: \ Datensätze \ set1) außerhalb der App - Benutzer die App startet und stürzt < - das ist die Ausnahme ist, ich versuche zu> behandeln

um Fehler in einer Aufgabe Kette handhaben, müssen Sie nicht jede Operation jeder Fortsetzung aufgabenbasierte oder umschließen machen, dass könnte in einen Versuch werfen ... catch Block. Stattdessen können Sie am Ende der Kette eine aufgabenbasierte Fortsetzung hinzufügen und dort alle Fehler behandeln. Weitere Informationen finden Sie unter Handling errors in a task chain.

+0

'PickedFolderToken' wurde bereits festgelegt, als die Anwendung zuletzt verwendet wurde. Wenn die App gestartet wird, öffnet sie den Arbeitsordner, den der Benutzer in der letzten Sitzung ausgewählt hat. Ich verwende if (Windows :: Storage :: AccessCache :: StorageApplicationPermissions :: FutureAccessList-> ContainsItem ("PickedFolderToken")), um zu bestimmen, ob dies beim letzten Mal gesetzt wurde, und gibt wahr wie erwartet zurück. Ich versuche, den Fall zu behandeln, in dem das zuvor ausgewählte Arbeitsverzeichnis nicht mehr zugänglich ist. – Oliver9523

+0

Können Sie mehr Details zu Ihrem ausgewählten Arbeitsverzeichnis anzeigen? –

+0

habe den ursprünglichen Beitrag aktualisiert – Oliver9523