Я хотел бы добавить еще несколько предложений, основанных на моей последней реализации. Я просмотрел какой-то код от 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];
это самый смешной пример, когда –
это довольно удивительный ответ, хотя есть некоторые проблемы в АРК и заливке 'id' в виде' BOOL'. Любые незначительные вариации, совместимые с ARC, будут высоко оценены. – NSTJ
@TomJowett Я был бы в самом разгаре, если бы мы не смогли положить конец голоду в мире просто потому, что Apple заставила нас перейти к новому миру ARC. – Manav