传递错误代表
Posted
技术标签:
【中文标题】传递错误代表【英文标题】:Passing Error Delegates Around 【发布时间】:2011-07-26 08:19:04 【问题描述】:我正在尝试将某种错误处理功能整合到 ios 应用程序中。在阅读了 try/catch 块并不是很好的做法之后,我现在正在查看 NSURLConnection 的 &error 输出参数。我正在尝试传递对 NSError 的引用,然后我继续通过链向下传递它。
第一个函数调用我的 DAL 中的一个方法:
NSError *error = nil;
SearchResult *res = [db getHereditaments:&error];
if (error)
[self performSelectorOnMainThread:@selector(DisplayError:) withObject:error waitUntilDone:NO];
//todo: handle error
else
[self performSelectorOnMainThread:@selector(DisplayResults:) withObject:res waitUntilDone:NO];
然后第二种方法(称为)尝试传递错误。这工作正常,直到我添加了对 NSError 是否为 nil 的检查,并且在这种情况下返回了数据,那么为什么还会返回错误呢?
调用的方法是:
-(SearchResult *) getData:(NSError**)error
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSString *userName = [prefs stringForKey:UsernameKey];
NSString * password = [prefs stringForKey:PasswordKey];
NSURL *url = [UrlUtility getSearchResults:userName passwordHash:password];
CXMLDocument *responseObj = [UrlUtility xmlDocWithUrl:url onError:&error];
if(error ==nil)// should be nil if the connection was successful shouldn't it?
【问题讨论】:
当你测试nil
时什么不起作用?
程序流程对我来说不是很清楚,但我想知道您为什么尝试将错误指针传递给第二个函数。如果发生错误,使用错误变量调用第二个函数有什么意义?除此之外,您应该检查返回的对象是否为 nil,如果是,则发生错误,此时您应该检查错误变量,而不是相反。所以首先检查 responseObj 是否为 nil,如果是,您可以检查错误变量。 P.S.:您能否显示+xmlDocWithUrl:onError:
的代码 - 您的问题的原因可能在于此方法。
【参考方案1】:
好的,首先,如果您将相同的错误沿链传递,则需要将 &*error 传递给方法。
其次,如果您完全处理错误指针,您通常希望处理 *error 而不是错误。
第三,你永远不应该检查 error == nil。您应该检查 responseObj == nil。如果是这样,那么你可以使用错误,如果不是,那么你不应该有错误。
最后,与主题不完全相关,但应该可以帮助您作为开发人员,您不应该在方法名称的开头使用“get”。 Get 仅用于通过引用返回各种值,您通常应该避免这种情况。您的方法可能应该类似于 downloadSearchResultsWithError: 和 URLForSearchResultsWithUsername:password:
【讨论】:
以上是关于传递错误代表的主要内容,如果未能解决你的问题,请参考以下文章