0

我已经开发了一些iOS 6.1代码来处理NSError. 但是,我对此并不满意。它充其量只是一个黑客:

 -(bool) reptErrAtModule: (NSString *) module
                  atSubr: (NSString *) subr
                  atFunc: (NSString *) func
                 withErr: (NSError *) err
   {
   id value = [[err userInfo] objectForKey: NSUnderlyingErrorKey];
   NSString * errDesc = (value != nil) ? 
                        [value localizedDescription]:
                        (NSString *)[[err userInfo] objectForKey: @"reason"];

   NSLog( @"ERR -> %@",[NSString stringWithFormat: 
          @"(%@>%@) %@ failed! %@",module,subr,func,errDesc] );
   }

我有一个更简单的形式(没有(NSString *)[[err userInfo] objectForKey: @"reason"]案例),它适用于我从调用removeItemAtPath.

但是后来我从这段代码中得到了一个错误:

NSPersistentStore * entStor = 
 [myPerStoCor addPersistentStoreWithType: NSSQLiteStoreType
                           configuration: nil
                                     URL: [NSURL fileURLWithPath: Path]
                                 options: nil
                                   error: &err];

我的例程未能提取错误。所以我添加了@"reason"逻辑,因为我可以在调试器的 Info 数据中看到我想要的文本。

现在代码适用于两种类型的错误,但我认为这不是这样做的方法。必须有一种更好、更通用的方法来处理系统可以返回给您的所有类型的错误NSError

4

2 回答 2

0

出于调试目的,您最好注销错误的全部内容。粗略地说,这是domain,codeuserInfo。请记住,这userInfo很可能包含一个潜在的错误,您希望对其应用相同的逻辑。在某些情况下,错误可能会提供一个描述(或失败原因等),userInfo.

如果您在http://www.mikeabdullah.net/easier-core-data-error-debugging.html向下滚动我的博客文章,那里有一个片段显示如何生成NSError对象的字典表示,然后获取一个字符串的代表。这对于调试/记录目的非常方便。

但是,为了向用户展示,-[NSError localizedDescription]它是专门为此目的而设计的。-localizedFailureReason起到类似的作用,倾向于指定出了什么问题,而没有尝试操作的上下文。(一种思考方式是localizedDescription = task desceription + localizedFailureReason

于 2013-09-08T10:48:25.897 回答
0

我用这个:

NSString *description = error.localizedDescription;
NSString *reason = error.localizedFailureReason;
NSString *errorMessage = [NSString stringWithFormat:@"%@ %@", description, reason];
于 2013-09-05T11:56:00.423 回答