Objective-C 框架错误处理

标签 objective-c cocoa frameworks exception error-handling

我正在创建一个框架,供 10.6 及更高版本上的 Cocoa 应用程序使用。

该框架的目的是解析文本文件。

显然,可能会出现错误,例如找不到文件、权限问题等。

处理框架内的错误并通知主机应用程序的正确方法是什么?

我的想法是:

  1. 什么也不做,让主机应用程序捕获任何异常。

  2. 让主机应用程序向框架注册其第一个响应程序,捕获任何异常,将它们转换为 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/

相关文章:

php - 如何(或在哪里)使用 Zend Framework 2 的 EventManager?

ios - iPad OS 是否可以检测键盘是否处于 float 模式?

应用程序未运行时的 iOS 可达性

objective-c - Mac OS X 的 Spotlight 插件中的自定义关键字

python - Python 有哪些网络库/框架?

ios - 如何创建具有内部框架的框架?

objective-c - 如何禁用clang中的-Wcompare-distinct-pointer-types警告?

ios - monotouch 库和我使用的一些第 3 方库中的重复符号

cocoa - 如何在Cocoa中访问包含字符串 "xyz"的所有文件和文件夹名称

xcode - 以编程方式构建 ViewController 的 View 时,使编译器了解 NSView 子类方法