Objective-C Kurz gesagt Ausnahmen und Fehler

In Objective-C gibt es zwei Arten von Fehlern, die auftreten können, während ein Programm ausgeführt wird. Unerwartet Fehler sind "schwerwiegende" Programmierfehler, die normalerweise dazu führen, dass Ihr Programm vorzeitig beendet wird. Diese nennt man Ausnahmen, da sie eine außergewöhnliche Bedingung in Ihrem Programm darstellen. Auf der anderen Seite, erwartet Fehler treten natürlich während der Programmausführung auf und können dazu verwendet werden, den Erfolg einer Operation zu bestimmen. Diese werden als bezeichnet Fehler.

Sie können die Unterscheidung zwischen Ausnahmen und Fehlern auch als Unterschied in ihren Zielgruppen ansprechen. Im Allgemeinen werden Ausnahmen verwendet, um das zu informieren Programmierer über etwas, was schief gelaufen ist, während Fehler verwendet werden, um die zu informieren Nutzer dass eine angeforderte Aktion nicht abgeschlossen werden konnte.

Kontrollfluss für Ausnahmen und Fehler

Der Versuch, auf einen nicht vorhandenen Array-Index zuzugreifen, ist beispielsweise eine Ausnahme (Programmierfehler), während das Öffnen einer Datei einen Fehler darstellt (Benutzerfehler). Im ersten Fall ist im Programmfluss wahrscheinlich etwas schiefgelaufen, und es sollte wahrscheinlich kurz nach der Ausnahme heruntergefahren werden. In letzterem Fall möchten Sie dem Benutzer mitteilen, dass die Datei nicht geöffnet werden kann, und möglicherweise die Aktion erneut versuchen. Es gibt jedoch keinen Grund, warum Ihr Programm nach dem Fehler nicht weiter ausgeführt werden kann.


Ausnahmebehandlung

Der Hauptvorteil der Ausnahmebehandlungsfunktionen von Objective-C ist die Möglichkeit, die Fehlerbehandlung von der Erkennung von Fehlern zu trennen. Wenn ein Teil des Codes auf eine Ausnahme stößt, kann er diese zum nächstgelegenen Fehlerbehandlungsblock "werfen", der bestimmte Ausnahmen "fangen" und entsprechend behandeln kann. Die Tatsache, dass Ausnahmen von beliebigen Positionen aus geworfen werden können, beseitigt die Notwendigkeit, ständig nach Erfolg oder Fehlermeldungen von jeder Funktion zu suchen, die an einer bestimmten Aufgabe beteiligt ist.

Das @Versuchen, @Fang(), und @endlich Compiler-Direktiven werden verwendet, um Ausnahmen abzufangen und zu behandeln @werfen Direktive wird verwendet, um sie zu erkennen. Wenn Sie mit Ausnahmen in C # gearbeitet haben, sollten Ihnen diese Ausnahmebehandlungskonstrukte bekannt sein.

Es ist wichtig zu beachten, dass in Objective-C Ausnahmen relativ langsam sind. Daher sollte ihre Verwendung darauf beschränkt sein, schwerwiegende Programmierfehler aufzufangen - nicht für den grundlegenden Steuerungsfluss. Wenn Sie versuchen zu bestimmen, was zu tun ist, basierend auf einer erwartet Fehler (z. B. beim Laden einer Datei fehlgeschlagen) Abschnitt zur Fehlerbehandlung.

Die NSException-Klasse

Ausnahmen werden als Instanzen von dargestellt NSException Klasse oder eine Unterklasse davon. Dies ist eine bequeme Methode, um alle notwendigen Informationen zu kapseln, die einer Ausnahme zugeordnet sind. Die drei Eigenschaften, die eine Ausnahme darstellen, werden wie folgt beschrieben:

  • Name - Eine Instanz von NSString das identifiziert die Ausnahme eindeutig.
  • Grund - Eine Instanz von NSString enthält eine von Menschen lesbare Beschreibung der Ausnahme.
  • Benutzerinformation - Eine Instanz von NSDictionary Das enthält anwendungsspezifische Informationen zu der Ausnahme.

Das Foundation Framework definiert mehrere Konstanten, die die "Standard" -Ausnahmennamen definieren. Diese Zeichenfolgen können verwendet werden, um zu prüfen, welche Art von Ausnahme abgefangen wurde.

Sie können auch die initWithName: Grund: BenutzerInfo: Initialisierungsmethode, um neue Ausnahmeobjekte mit eigenen Werten zu erstellen. Benutzerdefinierte Ausnahmeobjekte können mit denselben Methoden abgefangen und ausgelöst werden, die in den nächsten Abschnitten beschrieben werden.

Ausnahmen generieren

Beginnen wir mit einem Blick auf das Standardverhalten von Programmen für die Behandlung von Ausnahmen. Das objectAtIndex: Methode von NSArray ist definiert, um ein zu werfen NSRangeException (eine Unterklasse von NSException) wenn Sie versuchen, auf einen Index zuzugreifen, der nicht vorhanden ist. Also, wenn Sie die 10 anfordernth Element eines Arrays, das nur drei Elemente enthält, haben Sie eine Ausnahme, mit der Sie experimentieren können:

#einführen  int main (int argc, const char * argv []) @autoreleasepool NSArray * crew = [NSArray ArrayWithObjects: @ "Dave", @ "Heywood", @ "Frank", nil]; // Dies wird eine Ausnahme auslösen. NSLog (@ "% @", [crew objectAtIndex: 10]);  return 0; 

Wenn Xcode auf eine nicht erfasste Ausnahme stößt, hält er das Programm an und zeigt Sie auf die Zeile, die das Problem verursacht hat.

Abbruch eines Programms aufgrund einer nicht erfassten Ausnahme

Als Nächstes erfahren Sie, wie Sie Ausnahmen abfangen und verhindern, dass das Programm beendet wird.

Ausnahmen fangen

Um eine Ausnahme zu behandeln, muss jeder Code kann Eine Ausnahme sollte in ein @Versuchen Block. Dann können Sie bestimmte Ausnahmen mit der @Fang() Richtlinie. Wenn Sie einen Housekeeping-Code ausführen müssen, können Sie ihn optional in ein einfügen @endlich Block. Das folgende Beispiel zeigt alle drei dieser Ausnahmebehandlungsrichtlinien:

@Try NSLog (@ "% @", [crew objectAtIndex: 10]);  @catch (NSException * Ausnahme) NSLog (@ "Eine Ausnahme erhalten"); // Wir ignorieren einfach die Ausnahme.  @ final NSLog (@ "Aufräumen"); 

Dies sollte folgendes in Ihrer Xcode-Konsole ausgeben:

Eine Ausnahme erwischt! Name: NSRangeException Grund: *** - [__ NSArrayI objectAtIndex:]: Index 10 außerhalb der Grenzen [0… 2] Bereinigung

Wenn das Programm auf das trifft [crew objectAtIndex: 10] Nachricht, wirft ein NSRangeException, was ist in der gefangen @Fang() Richtlinie. Innerhalb der @Fang() Block ist, wo die Ausnahme tatsächlich behandelt wird. In diesem Fall wird nur eine beschreibende Fehlermeldung angezeigt. In den meisten Fällen möchten Sie jedoch wahrscheinlich etwas Code schreiben, um das Problem zu beheben.

Wenn im System eine Ausnahme auftritt @Versuchen Satz springt das Programm zum entsprechenden @Fang() Block, der jeden Code bedeutet nach dem Die aufgetretene Ausnahme wird nicht ausgeführt. Dies stellt ein Problem dar, wenn die @Versuchen block muss einige Aufräumarbeiten durchführen (z. B. muss die Datei geschlossen werden, wenn eine Datei geöffnet wurde). Das @endlich Block löst dieses Problem, da es ist garantiert unabhängig davon, ob eine Ausnahme aufgetreten ist. Dies macht es zum idealen Ort, um die losen Enden des Beins zu binden @Versuchen Block.

Die Klammern nach dem @Fang() Mit der Direktive können Sie festlegen, welche Art von Ausnahme Sie abfangen möchten. In diesem Fall ist es eine NSException, Dies ist die Standardausnahmeklasse. Eine Ausnahme kann jedoch tatsächlich sein irgendein Klasse - nicht nur eine NSException. Zum Beispiel folgendes @Fang() Direktive behandelt ein generisches Objekt:

@catch (id genericException)

Wir lernen, wie man Instanzen wirft NSException sowie generische Objekte im nächsten Abschnitt.

Ausnahmen werfen

Wenn Sie in Ihrem Code eine Ausnahmebedingung erkennen, erstellen Sie eine Instanz von NSException und füllen Sie es mit den relevanten Informationen. Dann werfen Sie es mit dem passenden Namen @werfen Anweisung, die nächstgelegene @Versuchen/@Fang Block, um damit umzugehen.

Das folgende Beispiel definiert beispielsweise eine Funktion zum Generieren von Zufallszahlen zwischen einem angegebenen Intervall. Wenn der Aufrufer ein ungültiges Intervall durchführt, gibt die Funktion einen benutzerdefinierten Fehler aus.

#einführen  int generateRandomInteger (int minimum, int maximum) if (minimum> = maximum) // Ausnahme erstellen. NSException * exception = [NSException exceptionWithName: @ "RandomNumberIntervalException" Grund: @ "*** generateRandomInteger ():" "Maximaler Parameter nicht größer als minimaler Parameter" userInfo: nil]; // Die Ausnahme auslösen. @ Throw-Ausnahme;  // Gibt eine zufällige ganze Zahl zurück. return arc4random_uniform ((Maximum - Minimum) + 1) + Minimum;  int main (int argc, const char * argv []) @autoreleasepool int result = 0; @Try Ergebnis = generateRandomInteger (0, 10);  @catch (NSException * -Ausnahme) NSLog (@ "Problem !!! Gefangene Ausnahme:% @", [Name der Ausnahme]);  NSLog (@ "Zufallszahl:% i", Ergebnis);  return 0; 

Da dieser Code ein gültiges Intervall (0,10) zu generateRandomInteger (), es wird keine Ausnahme zu fangen haben. Wenn Sie jedoch das Intervall in etwas ändern (0, -10), wirst du das sehen @Fang() in Aktion blockieren. Dies ist im Wesentlichen das, was unter der Haube abläuft, wenn die Framework-Klassen auf Ausnahmen stoßen (z. B. die NSRangeException aufgezogen von NSArray).

Es ist auch möglich, bereits erfasste Ausnahmen erneut zu werfen. Dies ist nützlich, wenn Sie informiert werden möchten, dass eine bestimmte Ausnahme aufgetreten ist, diese jedoch nicht unbedingt selbst behandeln möchten. Der Einfachheit halber können Sie das Argument auch in das weglassen @werfen Direktive:

@Try Ergebnis = generateRandomInteger (0, -10);  @catch (NSException * -Ausnahme) NSLog (@ "Problem !!! Gefangene Ausnahme:% @", [Name der Ausnahme]); // Die aktuelle Ausnahme erneut auslösen. @werfen 

Dadurch wird die abgefangene Ausnahme an den nächsthöheren Handler übergeben, der in diesem Fall der oberste Ausnahmebehandler ist. Dies sollte die Ausgabe von unserem anzeigen @Fang() Block sowie die Standardeinstellung App wird wegen nicht abgeholter Ausnahme beendet… Nachricht, gefolgt von einem abrupten Abbruch.

Das @werfen Direktive ist nicht beschränkt auf NSException Objekte können es buchstäblich werfen irgendein Objekt. Das folgende Beispiel wirft ein NSNumber Objekt statt einer normalen Ausnahme. Beachten Sie auch, wie Sie durch Hinzufügen mehrerer Objekte verschiedene Objekte anvisieren können @Fang() Aussagen nach dem @Versuchen Block:

#einführen  int generateRandomInteger (int minimum, int maximum) if (minimum> = maximum) // Generiere eine Zahl mit "default" Intervall. NSNumber * guess = [NSNumber numberWithInt: generateRandomInteger (0, 10)]; // Wirf die Nummer. @ Throw raten  // Gibt eine zufällige ganze Zahl zurück. return arc4random_uniform ((Maximum - Minimum) + 1) + Minimum;  int main (int argc, const char * argv []) @autoreleasepool int result = 0; @Try Ergebnis = generateRandomInteger (30, 10);  @catch (NSNumber * guess) NSLog (@ "Warnung: Verwendetes Standardintervall"); result = [rate intValue];  @catch (NSException * -Ausnahme) NSLog (@ "Problem !!! Gefangene Ausnahme:% @", [Name der Ausnahme]);  NSLog (@ "Zufallszahl:% i", Ergebnis);  return 0; 

Anstatt einen zu werfen NSException Objekt, generateRandomInteger () versucht, eine neue Zahl zwischen einigen "Standard" -Begrenzungen zu generieren. Das Beispiel zeigt Ihnen wie @werfen kann mit verschiedenen Objekttypen arbeiten, aber streng genommen ist dies weder das beste Anwendungsdesign noch die effizienteste Verwendung der Ausnahmebehandlungstools von Objective-C. Wenn Sie wirklich vorhatten, den ausgelösten Wert wie im vorherigen Code zu verwenden, wäre es besser, wenn Sie eine einfache alte bedingte Prüfung mit verwenden NSError, wie im nächsten Abschnitt besprochen.

Darüber hinaus einige Kern-Frameworks von Apple erwarten von ein NSException Objekt, das geworfen werden soll, seien Sie daher bei der Integration in die Standardbibliotheken mit benutzerdefinierten Objekten.


Fehlerbehandlung

Während Ausnahmen dazu dienen sollen, den Programmierern mitzuteilen, wenn etwas schief gelaufen ist, sind Fehler eine effiziente und unkomplizierte Möglichkeit, um zu überprüfen, ob eine Aktion erfolgreich war oder nicht. Im Gegensatz zu Ausnahmen, Fehler sind entwickelt, um in Ihren alltäglichen Kontrollflussanweisungen verwendet zu werden.

Die NSError-Klasse

Fehler und Ausnahmen haben eines gemeinsam: Sie werden beide als Objekte implementiert. Das NSError Klasse kapselt alle notwendigen Informationen zur Darstellung von Fehlern:

  • Code - Ein NSInteger das ist die eindeutige Kennung des Fehlers.
  • Domain - Eine Instanz von NSString Definieren der Domäne für den Fehler (im nächsten Abschnitt genauer beschrieben).
  • Benutzerinformation - Eine Instanz von NSDictionary das enthält anwendungsspezifische Informationen, die sich auf den Fehler beziehen. Dies wird normalerweise viel mehr als die verwendet Benutzerinformation Wörterbuch von NSException.

Neben diesen Kernattributen, NSError speichert auch mehrere Werte, die beim Rendern und Verarbeiten von Fehlern hilfreich sind. Alle diese sind eigentlich Verknüpfungen in der Benutzerinformation Wörterbuch in der vorherigen Liste beschrieben.

  • localizedDescription - Ein NSString enthält die vollständige Beschreibung des Fehlers, die normalerweise den Grund für den Fehler enthält. Dieser Wert wird dem Benutzer normalerweise in einem Warnfenster angezeigt.
  • localizedFailureReason - Ein NSString enthält eine eigenständige Beschreibung der Fehlerursache. Dies wird nur von Clients verwendet, die die Fehlerursache aus ihrer vollständigen Beschreibung isolieren möchten.
  • recoverySuggestion - Ein NSString den Benutzer anweisen, den Fehler zu beheben.
  • localizedRecoveryOptions - Ein NSArray von Titeln, die für die Schaltflächen des Fehlerdialogs verwendet werden. Wenn dieses Array leer ist, ein einzelnes OK Die Schaltfläche wird angezeigt, um die Warnung zu schließen.
  • helpAnchor - Ein NSString um anzuzeigen, wenn der Benutzer die. drückt Hilfe Ankertaste in einem Alarmfenster.

Wie bei NSException, das initWithDomain: code: userInfo Methode kann verwendet werden, um eine benutzerdefinierte zu initialisieren NSError Instanzen.

Fehlerdomänen

Eine Fehlerdomäne ist wie ein Namespace für Fehlercodes. Codes sollten innerhalb einer einzelnen Domäne eindeutig sein, sie können sich jedoch mit Codes anderer Domänen überschneiden. Domänen bieten nicht nur Codekollisionen, sondern auch Informationen darüber, woher der Fehler kommt. Die vier Hauptfehlerdomänen sind: NSMachErrorDomain, NSPOSIXErrorDomain, NSOSStatusErrorDomain, und NSCocoaErrorDomain. Das NSCocoaErrorDomain enthält die Fehlercodes für viele Standard-Objective-C-Frameworks von Apple; Es gibt jedoch einige Rahmen, die ihre eigenen Domänen definieren (z., NSXMLParserErrorDomain).

Wenn Sie benutzerdefinierte Fehlercodes für Ihre Bibliotheken und Anwendungen erstellen müssen, sollten Sie diese immer hinzufügen dein eigenes Fehlerdomäne - Erweitern Sie niemals eine der integrierten Domänen. Das Erstellen einer eigenen Domain ist relativ trivial. Da es sich bei Domains nur um Strings handelt, müssen Sie lediglich eine String-Konstante definieren, die mit keiner der anderen Fehlerdomänen Ihrer Anwendung in Konflikt steht. Apple schlägt vor, dass Domänen die Form von haben com...ErrorDomain.

Fehler erfassen

Es gibt keine speziellen Sprachkonstrukte für die Handhabung NSError Instanzen (obwohl mehrere integrierte Klassen für den Umgang mit ihnen ausgelegt sind). Sie sind für die Verwendung mit speziell entwickelten Funktionen konzipiert, die ein Objekt zurückgeben, wenn sie erfolgreich sind Null wenn sie versagen Das allgemeine Verfahren zum Erfassen von Fehlern lautet wie folgt:

  1. Deklarieren Sie ein NSError Variable. Sie müssen es nicht zuordnen oder initialisieren.
  2. Übergeben Sie diese Variable als Doppelzeiger an eine Funktion, die kann einen Fehler ergeben. Wenn etwas schief geht, verwendet die Funktion diese Referenz, um Informationen zum Fehler aufzuzeichnen.
  3. Überprüfen Sie den Rückgabewert dieser Funktion auf Erfolg oder Misserfolg. Wenn der Vorgang fehlgeschlagen ist, können Sie verwenden NSError um den Fehler selbst zu behandeln oder dem Benutzer anzuzeigen.

Wie Sie sehen, funktioniert eine Funktion normalerweise nicht Rückkehr ein NSError object-it gibt den gewünschten Wert zurück, wenn es erfolgreich ist, andernfalls wird es zurückgegeben Null. Sie sollten immer den Rückgabewert einer Funktion verwenden, um Fehler zu erkennen. Verwenden Sie niemals das Vorhandensein oder Fehlen einer Funktion NSError Objekt, um zu überprüfen, ob eine Aktion erfolgreich war. Fehlerobjekte sollen nur einen potenziellen Fehler beschreiben, nicht aber, wenn ein Fehler aufgetreten ist.

Das folgende Beispiel zeigt einen realistischen Anwendungsfall für NSError. Es verwendet eine Datei-Lademethode von NSString, was eigentlich außerhalb des Umfangs des Buches liegt. Das iOS Prägnant Das Buch behandelt ausführlich die Dateiverwaltung, aber konzentrieren wir uns jetzt auf die Fehlerbehandlungsfunktionen von Objective-C.

Zuerst erzeugen wir einen Dateipfad, der auf zeigt ~ / Desktop / SomeContent.txt. Dann erstellen wir eine NSError Referenz und übergeben Sie es an die stringWithContentsOfFile: Kodierung: Fehler: Methode zum Erfassen von Informationen zu Fehlern, die beim Laden der Datei auftreten. Beachten Sie, dass wir ein übergeben Referenz zum *Error Zeiger, was bedeutet, dass die Methode einen Zeiger auf einen Zeiger (d. h. einen Doppelzeiger) anfordert. Dadurch kann die Methode die Variable mit ihrem eigenen Inhalt füllen. Zum Schluss überprüfen wir die Rückgabewert (nicht die Existenz der Error Variable) um zu sehen, ob stringWithContentsOfFile: Kodierung: Fehler: gelungen oder nicht. Wenn ja, ist es sicher, mit dem in der Datenbank gespeicherten Wert zu arbeiten Inhalt Variable; ansonsten benutzen wir die Error Variable, um Informationen darüber anzuzeigen, was falsch gelaufen ist.

#einführen  int main (int argc, const char * argv []) @autoreleasepool // Erzeuge den gewünschten Dateipfad. NSString * filename = @ "SomeContent.txt"; NSArray * pfade = NSSearchPathForDirectoriesInDomains (NSDesktopDirectory, NSUserDomainMask, YES); NSString * desktopDir = [pfade objectAtIndex: 0]; NSString * path = [desktopDir stringByAppendingPathComponent: Dateiname]; // Versuchen Sie die Datei zu laden. NSError * Fehler; NSString * content = [NSString stringWithContentsOfFile: Pfadkodierung: NSUTF8StringEncoding-Fehler: & error]; // Prüfen Sie, ob es funktioniert hat. if (content == nil) // Eine Art Fehler ist aufgetreten. NSLog (@ "Fehler beim Laden der Datei% @!", Pfad); NSLog (@ "Description:% @", [error localizedDescription]); NSLog (@ "Grund:% @", [error localizedFailureReason]);  else // Inhalt wurde erfolgreich geladen. NSLog (@ "Inhalt geladen!"); NSLog (@ "% @", Inhalt);  return 0; 

Seit der ~ / Desktop / SomeContent.txt Die Datei existiert wahrscheinlich nicht auf Ihrem Computer. Dieser Code führt höchstwahrscheinlich zu einem Fehler. Alles was Sie tun müssen, um den Ladevorgang erfolgreich zu gestalten, ist Erstellen SomeContent.txt auf deinem Desktop.

Benutzerdefinierte Fehler

Benutzerdefinierte Fehler können konfiguriert werden, indem ein Doppelzeiger auf einen akzeptiert wird NSError Objekt und bevölkern es auf eigene Faust. Denken Sie daran, dass Ihre Funktion oder Methode entweder ein Objekt oder zurückgeben soll Null, abhängig davon, ob es erfolgreich ist oder fehlschlägt (geben Sie das nicht zurück NSError Referenz).

Das nächste Beispiel verwendet einen Fehler anstelle einer Ausnahme, um ungültige Parameter in der Datenbank zu verringern generateRandomInteger () Funktion. Beachte das **Error ist ein Doppelzeiger, mit dem die zugrunde liegende Variable innerhalb der Funktion gefüllt werden kann. Es ist sehr wichtig zu prüfen, ob der Benutzer tatsächlich eine gültige Gültigkeit hat **Error Parameter mit if (Fehler! = NULL). Sie sollten dies immer in Ihren eigenen fehlergenerierenden Funktionen tun. Seit der **Error Parameter ist ein Doppelzeiger, über den können Sie der zugrundeliegenden Variablen einen Wert zuweisen *Error. Und auch hier überprüfen wir mit dem Fehler auf Fehler Rückgabewert (if (Ergebnis == null)), nicht der Error Variable.

#einführen  NSNumber * generateRandomInteger (int minimum, int maximum, Fehler NSError **) if (minimum> = maximum) if (error! = NULL) // Fehler erstellen. NSString * domain = @ "com.MyCompany.RandomProject.ErrorDomain"; int errorCode = 4; NSMutableDictionary * userInfo = [NSMutableDictionary-Wörterbuch]; [userInfo setObject: @ "Maximaler Parameter ist nicht größer als minimaler Parameter" forKey: NSLocalizedDescriptionKey]; // Fülle die Fehlerreferenz auf. * error = [[NSError-Zuordnung] initWithDomain: Domänencode: errorCode userInfo: userInfo];  return nil;  // Gibt eine zufällige ganze Zahl zurück. return [NSNumber numberWithInt: arc4random_uniform ((Maximum - Minimum) + 1) + Minimum];  int main (int argc, const char * argv []) @autoreleasepool NSError * error; NSNumber * result = generateRandomInteger (0, -10, & error); if (result == nil) // Prüfen Sie, was falsch gelaufen ist. NSLog (@ "Ein Fehler ist aufgetreten!"); NSLog (@ "Domäne:% @ Code:% li", [Fehlerdomäne], [Fehlercode]); NSLog (@ "Description:% @", [error localizedDescription]);  else // Kann den zurückgegebenen Wert verwenden. NSLog (@ "Zufallszahl:% i", [result intValue]);  return 0; 

Alle der localizedDescription, localizedFailureReason, und verwandte Eigenschaften von NSError sind tatsächlich in seiner gespeichert Benutzerinformation Wörterbuch mit speziellen Schlüsseln, die von definiert werden NSLocalizedDescriptionKey, NSLocalizedFailureReasonErrorKey, usw. Wir müssen also lediglich den Fehler beschreiben, indem Sie den entsprechenden Schlüsseln einige Strings hinzufügen, wie im letzten Beispiel gezeigt.

Normalerweise sollten Sie Konstanten für benutzerdefinierte Fehlerdomänen und -codes definieren, damit sie über Klassen hinweg konsistent sind.


Zusammenfassung

In diesem Kapitel wurden die Unterschiede zwischen Ausnahmen und Fehlern ausführlich erläutert. Ausnahmen dienen dazu, Programmierer über schwerwiegende Probleme in ihrem Programm zu informieren, während Fehler eine fehlgeschlagene Benutzeraktion darstellen. Generell sollte eine produktionsreife Anwendung erfolgen nicht Ausnahmen auslösen, außer bei wirklich außergewöhnlichen Umständen (z. B. wenn der Speicher eines Geräts zu knapp wird).

Wir haben die Grundnutzung von abgedeckt NSError, Denken Sie jedoch daran, dass mehrere integrierte Klassen für die Verarbeitung und Anzeige von Fehlern vorgesehen sind. Leider sind dies alles grafische Komponenten und daher außerhalb des Rahmens dieses Buches. Das iOS Prägnant Fortsetzung enthält einen speziellen Abschnitt zum Anzeigen und Beheben von Fehlern.

Im letzten Kapitel von Objective-C Kurz und bündig, Wir werden eines der verwirrenderen Themen in Objective-C besprechen. Wir werden entdecken, wie Blöcke uns behandeln lassen Funktionalität genauso behandeln wir Daten. Dies hat weitreichende Auswirkungen darauf, was in einer Objective-C-Anwendung möglich ist.

Diese Lektion stellt ein Kapitel von Objective-C Succinctly dar, ein kostenloses eBook des Teams von Syncfusion.