传递错误代表

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:

【讨论】:

以上是关于传递错误代表的主要内容,如果未能解决你的问题,请参考以下文章

Javascript事件函数传递的event对象参数

当他们被传递到另一个 AppDomain 时,是不是可以将代表编组为代理?

代表不响应选择器

代表客户端验证密钥斗篷不记名令牌

代表仍然是零

js 各种循环语法