首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理iPhone上的错误和异常

处理iPhone上的错误和异常
EN

Stack Overflow用户
提问于 2009-08-03 22:44:16
回答 2查看 2.4K关注 0票数 0

我正在为iPhone开发一个核心数据应用程序,我对整个平台等都很陌生。

我的问题是,我应该查找和处理多少错误和异常,例如在打开持久存储时。例如,查看"Locations“核心数据教程(希望在这里引用它是可以的):

(我的一些服务员的代码中包含了一些注释)

代码语言:javascript
复制
- (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上的严重错误?

编辑:在收到一些关于这个问题和其他相关问题的答案后,我对我想问的问题有了一些清晰的说明:

我现在明白可可中的异常主要是为了查找程序员错误,而不是运行时错误。您是否会在发布应用程序时不包括任何异常处理(如果没有添加是因为调试原因)?或者,我还是应该进行防御性编程,并使用大量的“尝试”?

由于iPhone应用程序是沙箱的,用户无法进入文件系统,那么在设计基于sqlite的核心数据应用程序时,有什么可能的运行时错误是智能的呢?我的意思是,数据库文件不太可能是disapear....but,也许将来的升级可能会失败,留下一个老的、无效的sqlite database....what是很好的实践吗?

另外,像object这样的其他东西很可能极不可能失败?早在happens....or.之前,你就会收到内存不足的警告?

而且,在上面的示例中,考虑错误和异常处理是什么好的编程实践呢?在这个例子中,我可以在methods...should中得到一个“深层”错误--我在那里处理错误,或者等到它以某种形式到达顶部(例如,一个零对象),或者在连锁反应中处理它们?

那怎么处理呢?登录到NSLog并继续吗?显示一个模式信息框并锁定等待用户退出应用程序?还是“错误xxx,按OK退出应用程序”?

还有,有什么方法可以直接显示模态对话框吗?我注意到,我引发的一些错误--会显示对话框--从来没有显示过,因为这个应用程序还在继续,后来crashed....is出现了一个SHOW方法?

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

Rgds PM

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-08-03 22:55:06

正如我在评论你的另一个问题时说的那样,Cocoa只使用异常来表示程序员似乎犯了错误--数组超出范围,Core数据数据库有错误的模式等等。错误被用来指示用户可能导致发生的事情--文件不存在,网络操作没有完成等等。因此,作为一个粗略的经验规则,在开发过程中查找异常,并将它们作为程序员来粉碎--引入了错误。准备好处理生产中的错误并从错误中恢复过来。

Mac上一个重要的边缘情况是分布式对象,它将异常用于连接的另一端或安全验证失败。

票数 2
EN

Stack Overflow用户

发布于 2009-08-04 00:59:32

如果文档要求这样做,您应该检查错误。

例如,在NSPersistentStoreCoordinator:addPersistentStoreWithType:configuration:URL:options:error:文档的文档中,请注意它说:

返回值 新创建的存储区,如果发生错误,则为零。

这意味着在发生错误时返回零。您应该检查它,因为否则您将有一个对nil的引用,一旦尝试使用它,它将导致运行时异常。对于应用程序来说,这不是一种优雅的操作方式--意外崩溃对于任何类型的用户应用程序来说都是不可接受的行为。

在Objective中,您通常不需要处理异常,因为它们用于异常情况。其他一些语言使用异常作为一种更好的方法来指示正常的错误条件,原因有很多。然而,这并不是目标C中的公约。

因此,您的问题的答案是:当API告诉您在错误情况下函数可以返回零时,您应该始终处理错误。

如果文档告诉您期望和处理异常,那么就这样做。否则就不要了。唯一的例外是,iff,,您知道自己在做什么,以及为什么。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1224975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档