CFStream:用户友好的错误

时间:2010-08-29 22:02:15

标签: iphone cocoa-touch sockets

我需要连接到远程主机并使用某种二进制协议交换数据。我正在联系:

CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"whatever.host.com", 
           port, &readStream, &writeStream);

一切都很好,除了错误处理。我是

  1. 在我的信息流的代理中处理NSStreamEventErrorOccurred
  2. 使用theError = [stream streamError];
  3. 检索错误
  4. 尝试使用[theError localizedDescription]获取用户友好的错误文本。
  5. 这是问题:而不是很好的错误消息,例如“未找到主机”,我得到"Operation could not be completed. (NSUnknownErrorDomain error 8.)"
    或者,当设备处于飞行模式时,我得到"The operation couldn’t be completed. (kCFErrorDomainCFNetwork error 2.)"

    问题:我如何获得套接字连接,在哪里可以检索正确的错误消息?当我使用NSURLConnection(在另一个应用程序中)时,错误信息非常友好,所以我想得到类似的东西。

3 个答案:

答案 0 :(得分:2)

Apple未提供有关iOS错误情况的正确说明。这是您的代码或他们的错误 - iOS设备上的字符串不存在

要提供更有趣的错误信息,您需要检查CFErrorNSError对象的域和代码并返回一些内容。 Apple网站上提供了kCFErrorDomainCFNetwork的错误说明列表here。像这样的代码会有所帮助 - 在构建错误演示UI时调用它:

NSString *GetUsefulErrorDescription(NSError *e) {
    NSString *codeString = [NSString stringWithFormat: @"%li", (long)[e code]];
    NSString *localized = NSLocalizedStringInTable(codeString, [e domain], nil);
    if (!localized || [localized isEqual: codeString])
        return [e localizedDescription];
    else
        return localized;
}

这会在您的应用包中名为“kCFErrorDomainCFNetwork.strings”的文件中查找字符串,例如“100”(对于kCFSOCKSErrorUnknownClientVersion,其值可以提供为“SOCKS服务器拒绝访问,因为它不支持与请求SOCKS版本。“)如果没有这样的错误描述,它将使用NSError返回的字符串,即”操作无法完成。[...]“

答案 1 :(得分:1)

我认为本地化错误描述的配置必须在框架级别进行。换句话说,Foundation框架开发人员提供了更多有用的消息,并且本地化人员对它们进行了翻译等。根据您的描述判断,CoreFoundation层在这方面没有受到太多关注。

您是否可以使用此处使用的Foundation API?

答案 2 :(得分:-1)

您是否认为更容易捕获错误,检查其类型并显示自定义错误消息?让我比重写代码更容易,只是为了制作好消息。额外奖励:这样您可以完全控制并可以添加更长的描述...