如何使用NSError初始化,传递参数和检查错误条件**

时间:2012-09-24 01:00:23

标签: objective-c xcode exception nserror

Xcode 4.3

我已经阅读了关于NSError **的SO问题,所以我写了一个简单的测试程序,它使用了Xcode 4.3推荐的稍微不同的语法(参见下面的__autoreleasing),所以我不是100%肯定如果这是正确的,虽然代码似乎确实正常运行。无论如何,只是一个简单的文件阅读器,如果找不到文件就会输出错误。

问题

想知道NSError初始化,使用&传递的参数和错误条件检查是否正确。 另外,在readFileAndSplit..方法中,我注意到if(!*error)if(!error)之间存在很大差异,事实上,if(!error)在没有出现错误条件时无效。

具有可能错误条件的文件读取方法

 -(NSArray*) readFileAndSplitLinesIntoArray:(NSError *__autoreleasing *) error {
    NSString* rawFileContents =
          [NSString stringWithContentsOfFile:@"props.txt"
                                    encoding:NSUTF8StringEncoding    
                                       error:error
    NSArray* fileContentsAsArray = nil;  
    if(!*error)
          fileContentsAsArray = 
                [rawFileContents componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];

    return fileContentsAsArray;

呼叫者

SimpleFileReader* reader = ...
NSError* fileError = nil;
NSArray* array = [reader readFileAndSplitLinesIntoArray: &fileError];

if(fileError){
  NSLog(@"Error was : %@, with code: %li", 
       [fileError localizedDescription],(long)[fileError code]);
} 

1 个答案:

答案 0 :(得分:3)

有几个问题。

首先,根据Apple's Error Handling Programming Guide,您应该检查方法的返回值以确定方法是否失败,而不是NSError。只有在方法失败的情况下,才使用NSError获取其他错误信息。

E.g:

NSArray* fileContentsAsArray = nil;
NSString* rawFileContents = [NSString stringWithContentsOfFile:@"props.txt"
                                encoding:NSUTF8StringEncoding    
                                   error:error];
if (rawFileContents)
{
    // Method succeeded
    fileContentsAsArray = [rawFileContents ...];
}

return fileContentsAsArray; // may be nil

其次,NSError out参数通常是可选的,可以是NULL。但是如果你将NULL错误变量传递给你的方法,它将在这一行崩溃:

if (!*error) { 

因为您正在取消引用NULL指针。相反,在引用指针之前必须始终检查NULL,如下所示:

if (error && *error) 
{
    // Do something with the error info
}

但是,如果您重写上述方法,则根本不会访问错误变量。