【问题标题】:Handling NSError when reading from file?从文件读取时处理 NSError?
【发布时间】:2009-11-27 13:57:47
【问题描述】:

我只是好奇我是否做得对。

NSString *fileContents;    
NSError *fileError = nil;

fileContents = [[NSString stringWithContentsOfFile:fileOnDisk
                          encoding:NSMacOSRomanStringEncoding
                          error:&fileError] retain];

if(fileError != nil) {
    NSLog(@"Error : %@", [fileError localizedDescription]);
}

// Other Code ...
[fileContents release];

.

编辑(以反映 bbums cmets)

.

NSString *fileOnDisk = @"/Users/Gary/Documents/Xcode/RnD/Maya.MEL";
NSError  *fileError; // Should this be *fileError = nil;
NSString *fileContents;
int       status = 0;

fileContents = [[NSString stringWithContentsOfFile:fileOnDisk
                          encoding:NSMacOSRomanStringEncoding
                          error:&fileError] retain];

if(fileContents == nil) {
    NSLog(@"FileError: %@", [fileError localizedDescription]);
    status = 1;
} else {
    NSLog(@"Success  : %@", fileContents);
}

// Clean up
[fileContents release];
[pool drain];
return status;

加里

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:
    NSError *fileError = nil;
    ....
    if(fileError != nil)
    ....
    

    这是不正确的。 在您检查 fileContents 是否为 nil 之前,您不能假设 fileError 的引用返回值。。永远不会。在调用 pass-error-by-reference 方法之前将 fileError 设置为 nil 没有任何用处。

    也就是说,您的代码应该是这样的(现在已修复,因为我不再在飞机之间奔跑,也不再在连接之间使用 WiFi……):

    NSString *fileContents;    
    NSError *fileError;
    
    fileContents = [[NSString stringWithContentsOfFile:fileOnDisk
                              encoding:NSMacOSRomanStringEncoding
                              error:&fileError] retain];
    
    if(fileContents == nil) {
        NSLog(@"Error : %@", [fileError localizedDescription]);
        // ... i.e. handle the error here more
        return ...; // often returning after handling the errors, sometimes you might continue
    }
    
    // Other Code ...
    [fileContents release];
    

    【讨论】:

    • bbum,你是说if(fileContents == nil) { 吗?
    • 谢谢 bbum,我可以看到你要去哪里,我可以看到现在检查 fileContents 是否为 nil 更有意义。但是,这不是相同的区别吗?如果 fileContents 为 nil,您不会只收到错误消息。当然,除非在某些情况下 fileContents 不是 nil 并且它们是错误的。感谢您的提示。
    • 在你的新版本中你还需要设置 NSError *fileError = nil;您现在检查文件内容似乎有点毫无意义?你有 NSError *fileError;代替?
    • 已编辑以修复我匆忙的答案。对于那个很抱歉。是的 -- 不需要初始化 fileError,因为您从不读取它除非您首先检查方法的返回值以确定实际发生了错误。
    猜你喜欢
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 2015-01-30
    • 2018-04-25
    • 2015-09-13
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多