2013-01-23 1 views
2

Comment attraper les exceptions d'E/S sur Windows Phone 8, C++/cx?
wp8 Gestion des exceptions d'E/S

EDIT: Voici un exemple complet

Vérifier si un fichier "hello.txt" existe:

StorageFile^ Testme(String^ fileName) 
{ 
    StorageFolder^ item = ApplicationData::Current->LocalFolder; 
    try 
    { 
     task<StorageFile^> getFileTask(item->GetFileAsync("hello.txt")); 
     getFileTask.then([](StorageFile^ storageFile) 
     { 
      return storageFile; 
     }); 
    } 
    catch (Exception^ ex) 
    { 
     OutputDebugString(L"Caught the exception"); 
    } 
    return nullptr; 
} 

Si "hello.txt" exsit, méthode Testme retourne le fichier PTR comme un charme.
Si « hello.txt n'existe pas, non seulement il ne jette pas exception filenotfound, au lieu que je vais écraser cette apparaître dans la fenêtre du débogueur:

exception non gérée à 0x71D49C01 (Msvcr110d.dll) dans MyPhoneApp.exe :. un paramètre non valide a été passé à une fonction qui prend en compte des paramètres non valides fatale S'il y a un gestionnaire pour cette exception, le programme peut être en toute sécurité a continué

Quel est le problème et comment pourrais-je vérifier avec élégance si un fichier existe de ou non dans WP8?

J'espère vraiment que quelqu'un répond ... Merci

+0

Pourriez-vous essayer d'intercepter un type général d'exception, c'est-à-dire 'catch (Exception e)' au lieu de nommer explicitement les exceptions? – dumbfingers

+0

Le problème n'est-il pas que l'exception se produit de manière asynchrone et que vous ne vérifiez pas le résultat de votre opération asynchrone? –

+1

1. Plate-forme :: Exception est l'exception la plus générale que j'ai pu trouver. 2. Désolé, j'aurais dû ajouter que je pense que j'ai exclu les problèmes asynchrones. Le code est enveloppé dans un create_task avec un alors. L'exception est levée lorsqu'elle devrait l'être, une fois la tâche terminée. Le problème est que je ne peux pas l'attraper. – Tinkerbell

Répondre

2

Après avoir passé des heures à comprendre quel était le problème dans une question connexe, j'ai finalement compris. En utilisant C++, il semble que Visual Studio se comporte un peu interessant. Au lieu de passer l'exception à l'utilisateur, il la jette juste. Cela signifie que même si vous aviez un gestionnaire pour l'exception, votre gestionnaire n'était pas autorisé à le gérer. Je devrais noter ici que cela se produit uniquement lorsque vous exécutez votre application dans Visual Studio. Le déploiement et le lancement de l'application ne présentent aucun problème. Pour résoudre ce problème, ouvrez les paramètres d'exceptions (à partir de Menu> Déboguer> Exceptions - ou Ctrl + D, E). Agrandir "C++ Exceptions" et désélectionner "Platform :: InvalidArgumentException" dans la colonne "Thrown". Alors vous devriez être bon à aller.

Mise à jour après la première commentaire:

Tout d'abord, je devais désactiver COMException dans la liste ci-dessous pour aussi par exemple pour travailler.

En plus de faire ci-dessus. Il est important de comprendre la programmation asynchrone en C++/CX. Vous ne pouvez pas simplement revenir de la fonction après avoir créé la tâche. Si vous avez vraiment besoin de revenir, vous devez renvoyer la tâche de travail que vous avez créée pour faire le travail. Voici un exemple d'application Windows Store (pas WP) mais ils devraient fonctionner de la même manière. Votre fonction d'assistance doit être comme ci-dessous.

concurrency::task<bool> TestFileExists::MainPage::Testme(String^ fileName) 
{ 
    using namespace Windows::Storage; 
    using namespace concurrency; 

    StorageFolder^ item = ApplicationData::Current->LocalFolder; 

    return create_task(item->GetFileAsync(fileName)).then([this](task<StorageFile^> t) 
    { 
      bool fileExists = true; 

      try { 
        StorageFile^ file = t.get(); 
      } 
      catch(Platform::Exception^ exp) 
      { 
        fileExists = false; 
      } 

      return (fileExists); 
    }); 
} 

Et vous devriez l'appeler comme ci-dessous. Je ne sais pas où se trouve le dossier local, donc je n'ai pas pu tester la condition dans laquelle le fichier est réellement là. S'il vous plaît tester et voir.

+1

Merci beaucoup de partager votre expérience. Cela ressemble tellement à ce que je vis. J'ai essayé de désélectionner comme vous l'avez dit et j'ai toujours la même erreur. Peut-être que sur un vrai appareil, il se comporterait différemment. – Tinkerbell

+0

J'ai mis à jour ma réponse avec un exemple de code pour suggérer une approche pour vous pour résoudre votre problème. –

+1

J'ai essayé le code dans WP8. En effet cela fonctionne comme un charme. Pouvez-vous s'il vous plaît expliquer plus en détail le problème asynchrone. Dans mon code, la méthode GetFileAsync() est exécutée à un moment donné. Voulez-vous dire qu'à ce moment-là, la prise est trop tardive? Ce qui veut dire que lorsque la tâche asynchrone est exécutée, le try catch n'est pas là, pour ainsi dire? – Tinkerbell