0

Ich bin developinga Core Data-App für das iPhone, und ich bin neu in der ganzen Plattform usw.Verarbeiten von Fehlern und Ausnahmen auf dem iPhone

Meine Frage ist, wie viel soll ich suchen und Fehler und Ausnahmen behandeln, zum Beispiel beim Öffnen des persistenten Speichers. Mit Blick auf die „Orte“ Core Data Tutorial zum Beispiel (hoffen, seine OK es so hier zu zitieren):

(Se Kommentare im Code für einige meiner conserns)

- (void)applicationDidFinishLaunching:(UIApplication *)application { 
    ...  
    NSManagedObjectContext *context = [self managedObjectContext]; 
    if (!context) { 
     // Handle the error. Can this ever happen with this code? (see next comment below) 



- (NSManagedObjectContext *) managedObjectContext { 
    ... 
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    // it seems even if I get an error or exception down in persistentStoreCoordinator, 
    // coordinator will still never be nil, or? 
    if (coordinator != nil) { 
     managedObjectContext = [[NSManagedObjectContext alloc] init]; 
     [managedObjectContext setPersistentStoreCoordinator: coordinator]; 
    } 
    return managedObjectContext; 
} 



- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 
    ... 
    NSError *error; 
    // should i have an: if managedObjectModel != nil here? 
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] [initWithManagedObjectModel: [self managedObjectModel]]; 
    //need a @try here too? 
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) { 
     // Handle error, do what? 
    }  
    return persistentStoreCoordinator;  
} 


- (NSManagedObjectModel *)managedObjectModel { 
    ... 
    //should have a @try here? But how to handle caught exceptions? Just return nil? 
    managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];  
    return managedObjectModel; 
} 

So ist die Frage wirklich, wo man nach Fehlern sucht, wo man nach Ausnahmen sucht, wie und wann man sie nach oben verbreitet, und wie man schwere Fehler auf dem iPhone auf eine gute Weise behandelt?


Edit: nach ein paar Antworten auf diese und meine andere damit zusammenhängende Frage Empfang Ich habe einige clearifications von dem, was ich versuche zu fragen: ich jetzt

Ausnahmen in Kakao verstehen sind meist Programmierer Fehler für die Suche, nicht Laufzeit Fehler. Würden Sie beim Versand der App so weit gehen, dass keine Ausnahmen behandelt werden (wenn sie nicht für Debug-Zwecke hinzugefügt wurden)? Oder sollte ich trotzdem defensiv programmieren und sowieso viel @try verwenden?

Da die iPhone-Apps Sandboxed sind und der Benutzer nicht zum Dateisystem gelangen kann, welche möglichen Laufzeitfehler sind beim Entwurf einer sqlite-basierten Kerndaten-App sinnvoll? Ich meine, die Datenbankdatei wird wahrscheinlich nicht verschwinden .... aber vielleicht könnte ein zukünftiges Upgrade fehlschlagen, wenn eine alte ungültige SQLite-Datenbank verlassen wird ... Was ist eine gute Praxis?

Auch andere Dinge wie Object Alloc sind wahrscheinlich extrem unwahrscheinlich zu scheitern? Sie würden eine niedrige Speicherwarnung bekommen, lange bevor das passiert .... oder ...?

Und was ist gute Programmierpraxis unter Berücksichtigung der Fehler - und Ausnahmebehandlung im obigen Beispiel, wo ich einen Fehler "tief" in den Methoden bekommen kann ... sollte ich den Fehler dort unten behandeln oder warten, bis es das erreicht oben in irgendeiner Form (ein Null-Objekt zum Beispiel), oder behandeln sie alle in einer Kettenreaktion?

Und, wie man damit umgeht? Bei NSLog anmelden und fortfahren? Zeigen Sie eine modale Infobox an und warten Sie, bis der Benutzer die App beendet hat. Oder "Error xxx, drücke OK, um die App zu beenden"?

Und gibt es eine Möglichkeit, einen modalen Dialog direkt anzuzeigen? Mir ist aufgefallen, dass einige Fehler, die einen Dialog anzeigen, nie gezeigt haben, dass die App fortgesetzt und später abgestürzt ist. Gibt es eine SHOW NOW-Methode?

Viele Fragen, hoffe, dass Sie interessiert wären, zumindest einige von ihnen zu beantworten, und dass dies für andere von Interesse sein könnte!

Rgds PM

+0

Petter, oder und Redakteur, könnten Sie bitte Ihre Formatierung beheben? Es ist fast unmöglich herauszufinden, auf was Sie sich in Inline-Kommentaren beziehen. – groundhog

Antwort

2

Wie ich auf Ihrer anderen Frage in einem Kommentar sagte, sind Ausnahmen nur durch das Cocoa-API verwendet, um Dinge zu zeigen, dass es der Programmierer falsch verstanden hat aussieht - ein Array außerhalb der Grenzen ist, Eine Core Data-Datenbank hat das falsche Schema usw. Fehler werden verwendet, um Dinge anzuzeigen, die der Benutzer verursachen könnte - eine Datei existiert nicht, ein Netzwerkvorgang wurde nicht abgeschlossen usw. Suchen Sie nach einer groben Faustregel Ausnahmen während der Entwicklung und zerquetschen sie als Programmierer eingeführt Bugs. Bereiten Sie sich auf Fehler in der Produktion vor.

Der eine wichtige Randfall auf dem Mac ist verteilte Objekte, die Ausnahmen für Dinge wie das andere Ende der Verbindung weggehen oder die Sicherheitsvalidierung nicht erfolgreich verwendet.

+0

Danke für eine noch bessere Erklärung! Ich habe den Beitrag jetzt bearbeitet, um weiter zu erklären, was ich sonst noch zu verstehen versuchte. –

1

Sie sollten nach Fehlern suchen, wenn die Dokumentation dies verlangt.

Zum Beispiel in der Dokumentation für die NSPersistentStoreCoordinator:addPersistentStoreWithType:configuration:URL:options:error: Dokumentation, feststellen, dass sie sagt:

Rückgabewert

Der neu erstellte Speicher oder, falls ein Fehler auftritt, gleich Null.

Das bedeutet, dass im Falle eines Fehlers ein Nil zurückgegeben wird. Sie sollten nachsehen, denn sonst haben Sie einen Verweis auf , die eine Laufzeitausnahme verursachen, sobald Sie versuchen, es zu verwenden. Das ist keine einfache Möglichkeit, eine Anwendung zu betreiben - ein unerwarteter Absturz ist kein akzeptables Verhalten für Benutzeranwendungen jeglicher Art.

In Objective-C Sie in der Regel sollte nicht haben mit Ausnahmen zu behandeln, weil sie für außergewöhnliche Situationen verwendet werden. Einige andere Sprachen verwenden Ausnahmen als eine bessere Möglichkeit, normale Fehlerbedingungen für eine Vielzahl von sehr guten Gründen anzuzeigen. Dies ist jedoch nicht die Konvention in Objective-C.

Also die Antwort auf Ihre Frage ist: Sie sollten immer Fehler behandeln, wenn die API Ihnen sagt, die Funktion kann eine Null im Fehlerfall zurückgeben.

Wenn die Dokumentation Ihnen sagt, Ausnahmen zu erwarten und zu behandeln, dann tun Sie es. Ansonsten nicht. Die einzige Ausnahme ist iffSie wissen, was Sie tun und warum.

+0

Vielen Dank, wird die Dokumentation für alle wichtigen Anrufe überprüfen! Ich könnte noch etwas Hilfe bei der Programmierpraxis verwenden, wie oben in meiner editierten Frage erwähnt .... –