Обработка ошибок и исключений на iPhone - PullRequest
0 голосов
/ 04 августа 2009

Я занимаюсь разработкой приложения Core Data для iPhone, и я новичок во всей платформе и т. Д.

У меня вопрос: сколько я должен искать и обрабатывать ошибки и исключения, например, при открытии постоянного хранилища. Посмотрите, например, на учебное пособие по базовым данным "Местоположения" (надеюсь, что это нормально, процитируйте его здесь вот так):

(Se комментариев в коде для некоторых из моих концертов)

- (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;
}

Таким образом, вопрос в том, где искать ошибки, где искать исключения, как и когда их распространять вверх, и как правильно обрабатывать серьезные ошибки на iPhone?


Редактировать: после получения некоторых ответов на этот и другие мои связанные вопросы у меня есть некоторые пояснения к тому, что я пытаюсь задать:

Теперь я понимаю, что исключения в какао в основном для поиска ошибок программиста, а не ошибок времени выполнения. Вы бы пошли настолько далеко, что не включили обработку исключений при доставке приложения (если не добавлены по причинам отладки)? Или мне все равно нужно программировать в обороне и все равно использовать много @try?

Поскольку приложения для iPhone находятся в «песочнице» и пользователь не может добраться до файловой системы, какие возможные ошибки времени выполнения целесообразно искать при разработке приложения с основными данными на основе sqlite? Я имею в виду, что файл базы данных, скорее всего, не исчезнет ... но, возможно, будущее обновление может не удастся, оставив старую неверную базу данных sqlite .... что такое хорошая практика?

Кроме того, другие вещи, такие как объект alloc, вероятно, вряд ли потерпят неудачу? Вы получите предупреждение о нехватке памяти задолго до того, как это произойдет .... или ...?

И что такое хорошая практика программирования, учитывая обработку ошибок и исключений в приведенном выше примере, где я могу получить ошибку "в глубине души" в методах ... я должен обработать ошибку там или подождать, пока она не достигнет вершины в какой-либо форме (например, нулевой объект) или обрабатывать их все в цепной реакции?

И как с ними обращаться? Войдите в NSLog и продолжайте? Показать модальное информационное окно и заблокировать ожидание выхода пользователя из приложения? Или «Ошибка xxx, нажмите ОК для выхода из приложения»?

И есть ли способ показать модальный диалог напрямую? Я заметил, что некоторые ошибки, которые я спровоцировал, которые отображали диалоговое окно, никогда не показывали это, потому что приложение продолжало работать, а затем падало .... Есть ли метод SHOW NOW?

Множество вопросов, надеюсь, вам будет интересно ответить хотя бы на некоторые из них, и что это может быть интересно другим!

Rgds PM

Ответы [ 3 ]

2 голосов
/ 04 августа 2009

Как я уже сказал в комментарии к вашему другому вопросу, исключения используются API-интерфейсом Какао только для обозначения того, что, похоже, программист ошибся - массив вышел за пределы, база данных Core Data имеет неверную схему и т. д. Ошибки используются для указания того, что может вызвать пользователь: файл не существует, сетевая операция не завершена и т. д. Так что, как грубое правило, во время разработки ищите исключения и задавайте их как программиста -внесенные ошибки Будьте готовы справиться и исправить ошибки в работе.

Один важный крайний случай на Mac - это Distributed Objects, который использует исключения для таких вещей, как разрыв соединения на другом конце или неуспешная проверка безопасности.

1 голос
/ 04 августа 2009

Вам следует проверить наличие ошибок, если в документации указано, что это необходимо.

Например, в документации для NSPersistentStoreCoordinator: addPersistentStoreWithType: конфигурация: URL: опции: ошибка: документация, обратите внимание, что она говорит:

Возвращаемое значение

Недавно созданное хранилище или, если произошла ошибка, ноль.

Это означает, что в случае ошибки возвращается ноль. Вы должны проверить это, потому что в противном случае у вас будет ссылка на nil , которая вызовет исключение времени выполнения, когда вы попытаетесь его использовать. Это не изящный способ работы приложения - неожиданный сбой просто неприемлемо для пользовательских приложений любого рода.

В Objective-C вы обычно не должны иметь дело с исключениями, потому что они используются для исключительных ситуаций. Некоторые другие языки используют исключения как лучший способ указать нормальные условия ошибки по разным причинам. Это, однако, не является соглашением в Objective-C.

Таким образом, ответ на ваш вопрос таков: вы всегда должны обрабатывать ошибки, когда API сообщает вам, что функция может вернуть nil в случае возникновения ошибки.

Если в документации сказано, что вы должны ожидать и обрабатывать исключения, сделайте это. В противном случае нет. Единственное исключение из этого если вы знаете, что делаете и почему.

0 голосов
/ 22 августа 2012
...