我正在创建一个框架,供 10.6 及更高版本上的 Cocoa 应用程序使用。
该框架的目的是解析文本文件。
显然,可能会出现错误,例如找不到文件、权限问题等。
处理框架内的错误并通知主机应用程序的正确方法是什么?
我的想法是:
什么也不做,让主机应用程序捕获任何异常。
让主机应用程序向框架注册其第一个响应程序,捕获任何异常,将它们转换为 NSError 并将它们传递到主机应用程序的响应程序链。
这两个选项有意义吗?还有其他选择吗?处理这个问题的正确方法是什么?
我已阅读错误和异常处理指南,但它们没有涵盖这种情况,仅描述应用程序本身内的错误处理。
最佳答案
我想说正确的方法是在所有可能出错的方法中直接使用 NSError
。我最近使用我创建的实用程序类完成了此操作,并且效果非常好。然后,您允许应用程序决定如何处理错误(崩溃、日志、其他),并且框架不需要担心。
以下是我用来创建错误对象的私有(private)类方法,允许底层 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;
}
关于Objective-C 框架错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10670999/