我正在为iPhone开发一个核心数据应用程序,我对整个平台等都很陌生。
我的问题是,我应该查找和处理多少错误和异常,例如在打开持久存储时。例如,查看"Locations“核心数据教程(希望在这里引用它是可以的):
(我的一些服务员的代码中包含了一些注释)
- (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
发布于 2009-08-03 22:55:06
正如我在评论你的另一个问题时说的那样,Cocoa只使用异常来表示程序员似乎犯了错误--数组超出范围,Core数据数据库有错误的模式等等。错误被用来指示用户可能导致发生的事情--文件不存在,网络操作没有完成等等。因此,作为一个粗略的经验规则,在开发过程中查找异常,并将它们作为程序员来粉碎--引入了错误。准备好处理生产中的错误并从错误中恢复过来。
Mac上一个重要的边缘情况是分布式对象,它将异常用于连接的另一端或安全验证失败。
发布于 2009-08-04 00:59:32
如果文档要求这样做,您应该检查错误。
例如,在NSPersistentStoreCoordinator:addPersistentStoreWithType:configuration:URL:options:error:文档的文档中,请注意它说:
返回值 新创建的存储区,如果发生错误,则为零。
这意味着在发生错误时返回零。您应该检查它,因为否则您将有一个对nil的引用,一旦尝试使用它,它将导致运行时异常。对于应用程序来说,这不是一种优雅的操作方式--意外崩溃对于任何类型的用户应用程序来说都是不可接受的行为。
在Objective中,您通常不需要处理异常,因为它们用于异常情况。其他一些语言使用异常作为一种更好的方法来指示正常的错误条件,原因有很多。然而,这并不是目标C中的公约。
因此,您的问题的答案是:当API告诉您在错误情况下函数可以返回零时,您应该始终处理错误。
如果文档告诉您期望和处理异常,那么就这样做。否则就不要了。唯一的例外是,iff,,您知道自己在做什么,以及为什么。
https://stackoverflow.com/questions/1224975
复制相似问题