如何使用块来处理 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 方法返回的错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP 处理 403 错误

使用自定义文本输入UIView处理返回键

如何使用 Laravel 的块来避免内存不足?

如何告诉 Android Studio 方法不返回

Grails 控制器中的异常处理

捕获多个自定义异常? - C++