Ich möchte einige weitere Vorschläge hinzufügen, die auf meiner letzten Implementierung basieren. Ich habe mir einen Code von Apple angesehen und denke, mein Code verhält sich ähnlich.
In den obigen Beiträgen wird bereits erläutert, wie NSError-Objekte erstellt und zurückgegeben werden, sodass ich mich nicht mit diesem Teil befassen werde. Ich werde nur versuchen, einen guten Weg vorzuschlagen, um Fehler (Codes, Nachrichten) in Ihre eigene App zu integrieren.
Ich empfehle, einen Header zu erstellen, der eine Übersicht über alle Fehler Ihrer Domain (z. B. App, Bibliothek usw.) enthält. Mein aktueller Header sieht folgendermaßen aus:
FSError.h
FOUNDATION_EXPORT NSString *const FSMyAppErrorDomain;
enum {
FSUserNotLoggedInError = 1000,
FSUserLogoutFailedError,
FSProfileParsingFailedError,
FSProfileBadLoginError,
FSFNIDParsingFailedError,
};
FSError.m
#import "FSError.h"
NSString *const FSMyAppErrorDomain = @"com.felis.myapp";
Wenn Sie nun die oben genannten Werte für Fehler verwenden, erstellt Apple einige grundlegende Standardfehlermeldungen für Ihre App. Ein Fehler kann wie folgt erstellt werden:
+ (FSProfileInfo *)profileInfoWithData:(NSData *)data error:(NSError **)error
{
FSProfileInfo *profileInfo = [[FSProfileInfo alloc] init];
if (profileInfo)
{
/* ... lots of parsing code here ... */
if (profileInfo.username == nil)
{
*error = [NSError errorWithDomain:FSMyAppErrorDomain code:FSProfileParsingFailedError userInfo:nil];
return nil;
}
}
return profileInfo;
}
Die von Apple generierte Standardfehlermeldung ( error.localizedDescription
) für den obigen Code sieht folgendermaßen aus:
Error Domain=com.felis.myapp Code=1002 "The operation couldn’t be completed. (com.felis.myapp error 1002.)"
Das Obige ist für Entwickler bereits sehr hilfreich, da in der Nachricht die Domäne angezeigt wird, in der der Fehler aufgetreten ist, und der entsprechende Fehlercode. Endbenutzer haben jedoch keine Ahnung, was Fehlercode 1002
bedeutet. Daher müssen wir jetzt für jeden Code einige nette Nachrichten implementieren.
Bei den Fehlermeldungen müssen wir die Lokalisierung berücksichtigen (auch wenn wir lokalisierte Nachrichten nicht sofort implementieren). Ich habe in meinem aktuellen Projekt den folgenden Ansatz verwendet:
1) Erstellen Sie eine strings
Datei, die die Fehler enthält. Strings-Dateien sind leicht zu lokalisieren. Die Datei könnte folgendermaßen aussehen:
FSError.strings
"1000" = "User not logged in.";
"1001" = "Logout failed.";
"1002" = "Parser failed.";
"1003" = "Incorrect username or password.";
"1004" = "Failed to parse FNID."
2) Fügen Sie Makros hinzu, um Ganzzahlcodes in lokalisierte Fehlermeldungen umzuwandeln. Ich habe 2 Makros in meiner Datei Constants + Macros.h verwendet. Ich füge diese Datei der Einfachheit halber immer in den Präfix-Header ( MyApp-Prefix.pch
) ein.
Konstanten + Makros.h
// error handling ...
#define FS_ERROR_KEY(code) [NSString stringWithFormat:@"%d", code]
#define FS_ERROR_LOCALIZED_DESCRIPTION(code) NSLocalizedStringFromTable(FS_ERROR_KEY(code), @"FSError", nil)
3) Jetzt ist es einfach, eine benutzerfreundliche Fehlermeldung basierend auf einem Fehlercode anzuzeigen. Ein Beispiel:
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:FS_ERROR_LOCALIZED_DESCRIPTION(error.code)
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];