NSURL URLWithString:引发异常

时间:2009-05-17 18:29:16

标签: iphone objective-c crash-reports

简而言之,[NSURL URLWithString:]似乎引发了异常。根据文档“如果字符串格式错误,则返回nil。”没有提及在任何情况下提出的例外情况。除此之外,我在编码URL并检查nil之前将字符串转换为URL。

在转换网址之前,有人可以提供关于它可能是哪个例外或我应该做什么其他错误检查的任何建议吗?

如果您对详细信息感兴趣,则调用代码如下所示:

NSString* tmpText = [newUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
if (tmpText == nil) {
    // error handling
}
else {
    NSURL* tmpURL = [NSURL URLWithString:tmpText];

这是iTunes Connect下载崩溃报告的一部分:

8   libobjc.A.dylib                 0x300c1f84 objc_exception_throw
9   CoreFoundation                  0x3029a598 +[NSException raise:format:arguments:]
10  CoreFoundation                  0x3029a538 +[NSException raise:format:]
11  Foundation                      0x30696dde -[NSURL initWithString:relativeToURL:]
12  Foundation                      0x30696cd8 +[NSURL URLWithString:relativeToURL:]
13  Foundation                      0x30696cae +[NSURL URLWithString:]
14  Yummy                           0x000146ca -[DeliciousPostCell setUrl:] + 46

似乎URL在某种程度上处于“坏”格式,但这应该真的返回nil而不是例外。

我从未见过自己提出的异常,所以我不能使用XCode来捕获代码,看看发生了什么。遇到问题的用户从未直接与我联系,所以我不能要求更多细节。任何建议都非常感谢。

更新(14/7/2009):看起来像是这样的黑客攻击,但我在可疑行周围添加了一个异常块。我还提出了一个Radar错误报告(#7031551),建议代码应与文档匹配。

5 个答案:

答案 0 :(得分:2)

我遇到过一些API抛出不应该根据文档的异常的情况。我的建议是确保(在你的实际代码中)tmpText真的不是nil(在这种情况下抛出异常,因为大多数apis期望NSStrings不是nil保存)。之后,只需在其周围添加异常处理,并向bugreporter.apple.com提交bug报告。

答案 1 :(得分:1)

你的字符串tmpText必须以某种方式格式错误(意味着它不符合RFC 2396)。不幸的是,由于你无法从用户那里得到该变量的确切内容,我无法帮助你弄清楚它为什么会出现格式错误。有关类似行为的报告,请参阅Apple的Open Radar上的this帖子。我知道该报告是关于将nil传递给URLWithString,但如果它将nil与任何其他格式错误的字符串视为相同,则行为(抛出异常)可能是相同的。

我建议您查看newUrl是如何创建的,看看是否可以找到任何可能不允许的字符进入的边缘情况。我的猜测就是问题所在。

答案 2 :(得分:1)

值得记录字符串的原始值以查看-initWithString:的输入是什么。需要注意的一件事是-stringByAddingPercentEscapesUsingEncoding:只会转义在网址中非法的字符,它们不会以任何方式对上下文敏感。因此,如果输入字符串是'http :::: host;:',那么它将不会转义任何字符,并且将保持无效的URL。

答案 3 :(得分:0)

在使用它们之前,您可以执行日志并查看newUrl和tmpText中的内容。这应该会让你知道从哪里开始寻找。

stringByAddingPercent ...不会返回nil(除非newUrl为nil)。

如果传递给它的字符串格式错误,则URLWithString:call将返回nil。所以url对象是你应该看到的nil检查(在调用openURL:方法之前)

答案 4 :(得分:0)

对于格式错误的网址,NSURL返回nil,NSLog返回字符串并设置断点,以确切了解传递给NSURL创建方法的内容。如果您的URLWithString使用硬编码值,那么这进一步证明您传递的任何内容都是格式错误的。注意stringByAddingPercentEscapesUsingEncoding和其他字符串方法,因为它们还可以添加一些NSURL收件人可能会阻塞的额外垃圾。