处理错误和异常的iPhone(Handling errors and exceptions on t

2019-10-29 19:00发布

我为iPhone developinga核心数据应用程序,我是新来整个平台等。

我的问题是,我应该多少寻找和开拓持久性存储时处理错误和异常,例如。 纵观“位置”核心数据教程例如(希望其确定在这里这样引用它):

(SE代码中的注释为我的一些conserns的)

- (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上的严重错误?


编辑:得到了一些答案,这和我的其他相关的问题后,我有什么,我尝试着问一些clearifications:

我现在明白了可可的例外是主要用于寻找程序员错误,而不是运行时错误。 你会去尽量出货应用程序时(如果不是为了调试原因加)不包括任何异常处理? 或者我应该还是防守编程和使用大量@try的呢?

由于iPhone应用程序的沙盒,并且用户不能得到文件系统,有什么可能的运行时错误是聪明的寻找设计源码基于核心数据的应用程序时? 我的意思是,数据库文件是不可能disapear ....但也许将来的升级可能会失败留下一个老无效SQLite数据库....有什么好的做法?

此外,其他像对象页头是probaly极不可能会失败? 这种情况发生之前,你会得到一个内存不足警告长时间....还是...?

而且,什么是良好的编程习惯考虑在上面的例子中,在那里我能得到一个错误“深处”的方法错误和异常处理......我应该处理错误那里或等待,直到它达到某种形式的顶部(例如nil对象),或者处理它们所有的连锁反应?

而且,如何处理? 记录到的NSLog去吗? 显示一个模式信息框并锁定等待用户退出应用程序? 或“Error XXX,按确定退出应用程序”?

而且,有没有办法直接显示一个模式对话框? 我注意到一些错误,我挑衅,将显示一个对话框,从来没有发现因为应用程序不断,后来坠毁....是有一个SHOW NOW方法?

问题很多,希望大家有兴趣回答,至少他们中的一些,而这可能是感兴趣的人!

RGDS PM

Answer 1:

正如我在上你的另一个问题评论说,例外只使用Cocoa API了,表示事情,它看起来像程序员已经得到了错误的 - 一个数组越界,核心数据的数据库有错模式等错误用来表示事物,用户可能会导致发生 - 一个文件不存在,网络操作没有完成等等。所以作为一个粗略的规则,在开发过程中寻找异常,粉碎他们的程序员介绍的错误。 准备处理和生产中的错误中恢复。

在Mac上的一个重要的边缘情况下分布式对象,它使用了象连接消失或安全验证没有成功的另一端例外。



Answer 2:

你应该检查错误,如果文件说,这样做。

例如,对于文档中NSPersistentStoreCoordinator:addPersistentStoreWithType:配置:网址:选项:错误:文档,请注意,它说:

返回值

新建的商店或,如果发生错误,零。

这意味着一个零是在错误的情况下返回。 你应该检查它,否则你将有一个参考为零 ,这导致一个运行时异常,一旦你尝试使用它。 这是不是一个应用程序来操作一个优雅的方式 - 意外崩溃只是不适合任何类型的用户应用程序能够接受的行为。

在Objective-C,你通常应该处理异常,因为它们用于特殊情况。 其他一些语言使用异常作为指示各种很好的理由正常的错误情况的更好的方法。 然而,这是不是在Objective-C的惯例。

所以回答你的问题是:当API告诉您该功能可以在错误条件的情况下返回一个 ,你应该总是处理错误。

如果文档讲述了期待和处理异常,那么这样做。 否则不。 唯一的例外是当且仅当 你知道自己在做什么,为什么。



Answer 3:

请点击此链接: http://www.allappsdevelopers.com/TopicDetail.aspx?TopicID=0961f76a-03c2-45b2-834f-bea007a1e7a2



文章来源: Handling errors and exceptions on the iPhone