5

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

任何人都可以就它可能是哪个异常或在转换 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 来捕获代码并查看发生了什么。遇到问题的用户从未直接联系过我,所以我无法询问更多细节。任何建议都非常感谢。

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

4

5 回答 5

2

我遇到了一些 API 抛出异常的情况,这些异常根据文档不应该出现。我的建议是确保(在您的实际代码中) tmpText 确实不是 nil (在这种情况下会引发异常,因为大多数期望 NSStrings 的 api 不是 nil 保存在那里)。之后,只需在其周围添加异常处理并将错误报告提交到 bugreporter.apple.com 即可。

于 2009-05-17T19:02:25.603 回答
1

值得记录字符串的原始值以查看输入的-initWithString:内容。需要注意的一件事是,它-stringByAddingPercentEscapesUsingEncoding:只会转义 url 中非法的字符,它们在任何情况下都不是上下文敏感的。所以如果输入字符串是'http::::host;:',那么它不会有任何字符被转义,并且仍然是一个无效的URL。

于 2009-05-17T19:41:08.990 回答
1

您的字符串 ,tmpText必须以某种方式格式错误(这意味着它的某些内容不符合RFC 2396)。不幸的是,由于您无法从用户那里获得该变量的确切内容,因此我无法帮助您找出其格式错误的原因。有关类似行为的报告,请参阅Apple 的 Open Radar 上的这篇文章。我知道该报告是关于传递nilURLWithString的,但如果它nil与任何其他格式错误的字符串相同,则行为(抛出异常)可能是相同的。

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

于 2009-05-17T19:03:19.160 回答
0

NSURL 为格式错误的 url 返回 nil,NSLog 你的字符串并设置断点以准确查看传递给你的 NSURL 创建方法的内容。如果您的 URLWithString 使用硬编码值,则进一步证明您传递的任何内容都是格式错误的。小心使用 stringByAddingPercentEscapesUsingEncoding 和其他字符串方法,因为它们还可以添加一些额外的废话,您的 NSURL 收件人可能会窒息。

于 2010-03-15T19:16:35.507 回答
0

在使用之前,您能否做一个日志并查看 newUrl 和 tmpText 中存在的内容。这应该让您知道从哪里开始寻找。

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

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

于 2009-05-18T10:26:42.617 回答