gpt4 book ai didi

objective-c - NSError: 使用 nil 来检测 Error 实际上会关闭错误报告吗?

转载 作者:太空狗 更新时间:2023-10-30 03:39:20 29 4
gpt4 key购买 nike

我养成了这样编写错误处理代码的习惯:

 NSError* error = nil;
NSDictionary *attribs = [[NSFileManager defaultManager] removeItemAtPath:fullPath error:&error];
if (error != nil) {
DLogErr(@"Unable to remove file: error %@, %@", error, [error userInfo]);
return;
}

但是看文档好像我弄错了。:

- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error

If an error occurs, upon return contains an NSError object that describes the problem. Pass NULL if you do not want error information.

从技术上讲,nil 和 NULL 之间没有区别,所以这是否意味着我实际上关闭了它并且永远不会收到错误消息(即使上面示例中的删除确实失败了)?有没有更好的编码方式?

谢谢。

最佳答案

首先,下面这行没有意义:

NSDictionary *attribs = [[NSFileManager defaultManager]
removeItemAtPath:fullPath error:&error];

-removeItemAtPath:error: 返回一个 BOOL 值,而不是字典。

我想我明白你对 NULL 值的疑惑。但是请仔细注意,方法签名中的错误参数中有 2 个 *:

- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error

这意味着指向指针的指针。当您传入 &error 时,您传入的是指向 NSError 的指针的地址。 (呃,其他人可能可以帮助我,因为在处理指向指针的指针时我的头仍然开始游泳)。换句话说,即使您已将 error 设置为 nil,您并没有将 error 传递给该方法,您是在传递&错误

那么,重写后的方法应该是这样的:

// If you want error detection:
NSError *error = nil;
if (![[NSFileManager defaultManager] removeItemAtPath:fullPath
error:&error]) {
NSLog(@"failed to remove item at path; error == %@", error);
// no need to log userInfo separately
return;
}

// If you don't:
if (![[NSFileManager defaultManager] removeItemAtPath:fullPath
error:NULL]) {
NSLog(@"failed to remove item at path");
return;
}

关于objective-c - NSError: 使用 nil 来检测 Error 实际上会关闭错误报告吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4719040/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com