如何使用块来处理 NS 方法返回的错误
Posted
技术标签:
【中文标题】如何使用块来处理 NS 方法返回的错误【英文标题】:How to use blocks to handle errors returned by NS methods 【发布时间】:2014-08-28 16:06:25 【问题描述】:我使用以下代码创建了一个文件:
NSMutableString *tabString = [NSMutableString stringWithCapacity:0]; // it will automatically expand
// write column headings <----- TODO
// now write out the data to be exported
for(int i = 0; i < booksArray.count; i++)
[tabString appendString:[NSString stringWithFormat:@"%@\t,%@\t,%@\t\n",
[[booksArray objectAtIndex:i] author],
[[booksArray objectAtIndex:i] binding],
[[booksArray objectAtIndex:i] bookDescription]]];
if (![self checkForDataFile: @"BnN.tab"]) // does the file exist?
[[NSFileManager defaultManager] createFileAtPath:documentsPath contents: nil attributes:nil]; // create it if not
NSFileHandle *handle;
handle = [NSFileHandle fileHandleForWritingAtPath: [NSString stringWithFormat:@"%@/%@",documentsPath, @"BnN.tab"]]; // <---------- userID?
[handle truncateFileAtOffset:[handle seekToEndOfFile]]; // tell handle where's the file fo write
[handle writeData:[tabString dataUsingEncoding:NSUTF8StringEncoding]]; //position handle cursor to the end of file (why??)
这是我用来读回文件的代码(用于调试目的):
// now read it back
NSString* content = [NSString stringWithContentsOfFile:[NSString stringWithFormat:@"%@/%@",documentsPath, @"BnN.tab"]
encoding:NSUTF8StringEncoding
error: ^ NSLog(@"error: %@", (NSError **)error);
];
我在最后一条语句中遇到 2 个构建错误:
将'void (^)(void)'发送到不兼容类型'NSError *__autoreleasing *'的参数
和
使用未声明的标识符“错误”
这是我第一次使用块来处理方法返回的错误;我无法在 SO 或 Google 中找到任何说明如何执行此操作的文档。我做错了什么?
【问题讨论】:
为什么你认为可以将块传递给NSError **
类型的参数?
呃...我在一个例子中看到过...错了,是吗?这是我遇到问题的block... SD
【参考方案1】:
该函数需要NSError**
参数,而不是块。你应该这样称呼它:
NSError *error = nil;
NSString* content = [NSString stringWithContentsOfFile: [NSString stringWithFormat:@"%@/%@", documentsPath, @"BnN.tab"]
encoding: NSUTF8StringEncoding
error: &error];
if (content == nil)
NSLog("error: %@", error);
【讨论】:
这不是检查错误情况的正确方法。正如 Apple 的“错误处理编程指南”中所述,您应该始终检查 返回值,在本例中为if (content == nil)
,并仅在返回值指示错误时评估错误变量。
@MartinR 好点,已修复。我想我最近在 node.js 世界上花费了太多时间并且有点超前了:)
老鼠!正如我在对 rmaddy 的评论中所提到的,我在搜索 Google 时看到块用作错误处理程序......所以我的下一个问题是:我如何判断我是否可以使用块?
@spokane-dude 如果参数采用块,则可以使用块。以上是关于如何使用块来处理 NS 方法返回的错误的主要内容,如果未能解决你的问题,请参考以下文章