Objective-C框架错误处理

时间:2012-05-20 05:23:15

标签: objective-c cocoa frameworks exception-handling error-handling

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

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

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

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

我的想法是:

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

  2. 让主机应用程序使用框架注册其第一个响应者,捕获任何异常,将它们转换为NSError并将它们传递给主机应用程序的响应者链。

  3. 这些选项中的任何一个都有意义吗?还有其他选择吗?处理这个问题的正确方法是什么?

    我已阅读错误和异常处理指南,但它们并未涵盖此情况,仅描述了应用程序本身内的错误处理。

2 个答案:

答案 0 :(得分:2)

我想说正确的方法是在所有可能出错的方法中直接使用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;
}

答案 1 :(得分:1)

异常仅应用于Objective-C中的终端错误。更具体地说,Cocoa和Cocoa Touch不保证跨越其边界的异常将在另一方出现,因此您不应该使用异常来进行错误处理。

向调用者报告错误的正确方法是通过NSError对象。您会注意到许多Cocoa和Cocoa Touch方法都包含一个NSError *参数,用于此目的。