2017-11-25 1 views
0

ich den folgenden Code haben:Essen Ausnahme oder überprüfen Sie Null?

private async Task <string>IsolatedStorageReadTextFile(string uFileName) 
{ 
     string sRet = ""; 

     StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(uFileName); 
     if (file != null) 
     { 
      using (var inputStream = await file.OpenReadAsync()) 
      using (var classicStream = inputStream.AsStreamForRead()) 
      using (var streamReader = new StreamReader(classicStream)) 
      { 
       while (streamReader.Peek() >= 0) 
       { 
        sRet = streamReader.ReadLine(); 
       } 
      } 
     } 
     return sRet; 
} 

Wenn die betreffende Datei nicht existiert, führt die IDE einen Fehler:

enter image description here

Sollte ich

1) lassen die IDE debug warner ignoriert diesen Fehler (sagen Sie "Brechen Sie nicht bei dieser Ausnahme"), und ich sollte einfach "if (file! = Null)" den Job

machen lassen

2) oder sollte ich prüfen, ob die Datei tatsächlich existiert

3) Try-Catch verwenden?

Ich hatte einen wichtigen Teil des Code hinzuzufügen nach den Antworten:

private async Task <bool> LocalExists(string uFileName) 
    { 
     bool b = false; 
     //https://stackoverflow.com/questions/8626018/how-to-check-if-file-exists-in-a-windows-store-app 
     try 
     { 
      StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(uFileName); 
      b = (file != null); 
     } 
     catch (Exception ex) 
     { 
      b = false; 
     } 

     return b; 
    } 

Dies wirft die gleiche Ausnahme, da in UWP, dort Zugang tatsächlich zu überprüfen, ob eine Datei existiert keine andere Möglichkeit scheint, als zu versuchen es:

How to check if file exists in a Windows Store App?

So bleibt die Frage.

+0

niemals Ausnahmen verwenden, um die Strömung des Codes zu fahren. Ein File.Exists vor dem Anruf wird eine Menge Ärger vermeiden. (nicht 100% sicher, aber immer noch ....) – Steve

Antwort

1

Sie können entweder die vorhandene Datei prüfen oder die Ausnahme behandeln.

Wenn Sie die Ausnahme nicht abfangen, wird die nächste Zeile nicht ausgeführt, so dass Sie Datei nicht auf Null überprüfen können (nicht wie andere Programmiersprache wie C++).

Die Option, nicht auf diese Option zu brechen, nur nicht anhalten (aktivieren Sie einen Haltepunkt) die Anwendung, wenn Ausnahme nur ausgelöst wird, ändert das Verhalten des Programms nicht.

+1

Ich möchte hinzufügen, dass das Überprüfen, ob die Datei existiert, einfach versuchen, darauf zuzugreifen: https://stackoverflow.com/questions/8626018/how-to-check-if -file-exists-in-a-windows-store-app, daher ist try-catch in jedem Fall aktuell erforderlich, denke ich. – tmighty

+0

Das gilt nur für die Windows Store App. Sie können überprüfen, ob eine Datei vorhanden ist oder nicht, indem Sie https://msdn.microsoft.com/en-us/library/system.io.file auswählen.existiert (v = vs.110) .aspx –

+1

Ich habe es mit UWP zu tun. Du meinst das wenn du "Windows Store App" sagst, oder? – tmighty

2

Sie sollten prüfen, ob die Datei existiert, es sei denn, sie sollte immer da sein, z. Weil es Teil Ihres Programms ist. Nichtsdestotrotz sollten Sie versuchen, die ganze Sache zu fangen, denn selbst wenn die Datei existiert, könnte sie gesperrt werden oder ein anderer Lesefehler könnte auftreten.

2

Von den drei vorgeschlagenen Lösungen (ignorieren Sie den Fehler, prüfen Sie, ob die Datei zuerst existiert oder fangen Sie die Ausnahme ab), nur das Abfangen der Ausnahme funktioniert. Durch das Ignorieren der Ausnahme wird die App zum Absturz gebracht. Überprüfen, ob die Datei vorhanden ist, bevor GetFileAsync aufgerufen wird, hat ein Timing-Problem, bei dem die Datei möglicherweise nach der Überprüfung, aber vor dem Öffnen entfernt wird.

Die vierte und beste Lösung besteht darin, StorageFile.TryGetItemAsync zu verwenden, um die Datei zurückzugeben, wenn sie existiert, oder null, wenn dies nicht der Fall ist.

StorageFile file = await ApplicationData.Current.LocalFolder.TryGetItemAsync(uFileName) as StorageFile; 
if (file != null) 
{ 
    //... 
} 

Der Faden verbunden, die sagt, dass es keine Möglichkeit gab, im Jahr 2011 für Windows Store-Anwendungen korrekt zu prüfen, ist es schon nicht mehr aktuell für UWP-Anwendungen im Jahr 2017

Verwandte Themen