NSKeyedUnarchiver - versuchen / fangen benötigt?

Soweit ich weiß, die Verwendung von@try/@catch Von Blöcken wird abgeraten, weilexceptions sollte nur auf nicht behebbare, katastrophale Fehler geworfen werden (siehe diese Diskussion mit einer netten Antwort von@bbum: Ausnahme Handeling in iOS).

Also habe ich meinen Code durchgesehen und einen gefunden@try/@catch Block, den ich nicht loswerden kann:

NSData *fileData = [NSData dataWithContentsOfFile: ....];

NSDictionary *dictionary;

@try {
   dictionary = [NSKeyedUnarchiver unarchiveObjectWithData: fileData];
}
@catch (NSException *exception) {
   //....
}
@finally {
  //...
}

Das Problem ist, dass (wie in derDokumentation) +unarchiveObjectWithData: wirft einNSInvalidArchiveOperationException wenn dasNSData enthält kein gültiges Archiv.

Da die Daten von einer Datei stammen, die der Benutzer ausgewählt hat, kann nicht garantiert werden, dass sie ein gültiges Archiv enthalten. Daher würde die Anwendung abstürzen, wenn eine falsche Datei ausgewählt würde.

Nun zwei Fragen:

Warum nicht+unarchiveObjectWithData: Komm einfach zurücknil (Bearbeiten: und einNSError**) Wenn das Archiv ungültig ist (dies scheint nicht als katastrophaler oder nicht behebbarer Fehler zu qualifizieren).Ist das obige Muster korrekt (mit@try)? Ich habe keine Methode gefunden, mit der wir im Voraus prüfen können, ob die Daten ein gültiges Archiv enthalten, und habe keine Möglichkeit gefunden, diesen Fall mithilfe des Delegate-Protokolls zu behandeln. Was habe ich übersehen?

Beachten Sie, dass der obige Code natürlich funktioniert. Ich frage mich nur, ob dies die beste Vorgehensweise ist.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage