Я хотел бы добавить еще несколько предложений, основанных на моей последней реализации. Я посмотрел на некоторый код от Apple и думаю, что мой код ведет себя примерно так же.
Посты выше уже объясняют, как создавать объекты NSError и возвращать их, поэтому я не буду беспокоиться об этой части. Я просто попытаюсь предложить хороший способ интеграции ошибок (кодов, сообщений) в ваше собственное приложение.
Я рекомендую создать 1 заголовок, который будет обзором всех ошибок вашего домена (например, приложения, библиотеки и т. Д.). Мой текущий заголовок выглядит так:
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";
Теперь при использовании вышеуказанных значений для ошибок Apple создаст для вашего приложения стандартное стандартное сообщение об ошибке. Ошибка может быть создана следующим образом:
+ (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;
}
Стандартное сгенерированное Apple сообщение об ошибке (error.localizedDescription
) для приведенного выше кода будет выглядеть следующим образом:
Error Domain=com.felis.myapp Code=1002 "The operation couldn’t be completed. (com.felis.myapp error 1002.)"
Вышесказанное уже весьма полезно для разработчика, поскольку в сообщении отображается домен, в котором произошла ошибка, и соответствующий код ошибки. Конечные пользователи не будут знать, что означает код ошибки 1002
, поэтому теперь нам нужно реализовать несколько приятных сообщений для каждого кода.
Для сообщений об ошибках мы должны помнить о локализации (даже если мы не реализуем локализованные сообщения сразу). Я использовал следующий подход в моем текущем проекте:
1) создайте файл strings
, который будет содержать ошибки. Строковые файлы легко локализуются. Файл может выглядеть следующим образом:
FSError.strings
"1000" = "User not logged in.";
"1001" = "Logout failed.";
"1002" = "Parser failed.";
"1003" = "Incorrect username or password.";
"1004" = "Failed to parse FNID."
2) Добавьте макросы для преобразования целочисленных кодов в локализованные сообщения об ошибках. Я использовал 2 макроса в моем файле Constants + Macros.h. Я всегда включаю этот файл в заголовок префикса (MyApp-Prefix.pch
) для удобства.
Константа + Macros.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) Теперь легко показать удобное сообщение об ошибке на основе кода ошибки. Пример:
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:FS_ERROR_LOCALIZED_DESCRIPTION(error.code)
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];