我想说正确的做法是在可错误的所有方法直接使用自己NSError
。我最近用我创建的一个实用程序类来完成这个任务,并且它工作得很好。然后,您可以让应用程序决定如何处理错误(崩溃,日志,其他),并且框架无需担心。
这里是私人类的方法我用来创建错误对象,以使得潜在的POSIX错误(errno
等):
#pragma mark - Private Methods
- (NSError *)error:(NSString *)localizedDescription
code:(EZipFileError)code
underlyingError:(NSError *)underlyingError
{
NSMutableDictionary *errorDetail = [NSMutableDictionary dictionary];
[errorDetail setValue:localizedDescription forKey:NSLocalizedDescriptionKey];
if (underlyingError != nil)
{
[errorDetail setValue:underlyingError forKey:NSUnderlyingErrorKey];
}
return [NSError errorWithDomain:@"MyErrorDomain"
code:(NSInteger)code
userInfo:errorDetail];
}
- (NSError *)error:(NSString *)localizedDescription
code:(EZipFileError)code
{
return [self error:localizedDescription
code:code
underlyingError:nil];
}
- (NSError *)error:(NSString *)localizedDescription
code:(EZipFileError)code
posixError:(int)posixError
{
NSMutableDictionary *underlyingErrorDetail = [NSMutableDictionary dictionary];
[underlyingErrorDetail setValue:[NSString stringWithUTF8String:strerror(posixError)]
forKey:NSLocalizedDescriptionKey];
NSError *underlyingError = [NSError errorWithDomain:NSPOSIXErrorDomain
code:posixError
userInfo:underlyingErrorDetail];
return [self error:localizedDescription
code:code
underlyingError:underlyingError];
}
被用作如下:
if (![self isOpen])
{
if (error != NULL)
{
*error = [self error:@"File is not open"
code:ErrorNotOpen];
}
return nil;
}
下面是一个使用该方法的基本POSIX错误版本的示例:
filefp = fopen([filename UTF8String], "rb");
if (filefp == NULL)
{
if (error != NULL)
{
*error = [self error:@"Failed to open file"
code:ErrorOpenFileFailed
posixError:errno];
}
return NO;
}
我从来没有听说过任何传递响应链的NSErrors的代码。 (如果调用代码与任何NSResponders完全无关,如使用命令行工具那么该怎么办?)不管你做什么:不要这样做! –
@KurtRevis,看看 - [NSResponder presentError:]和朋友,例如 –
啊,这很有趣 - 我必须错过那些时,他们被添加到10.4。我期望一个较低级别的框架(就像在这种情况下,只是解析一个文本文件)将一个“NSError”交给它的调用者,并让UI代码处理演示文稿。 –