NSURL URLWithString: вызывает исключение - PullRequest
4 голосов
/ 17 мая 2009

Короче говоря, [NSURL URLWithString:], похоже, вызывает исключение. Согласно документации «Если строка была искажена, возвращается ноль». Нет никаких упоминаний об исключении, выдвигаемом ни при каких обстоятельствах. В дополнение к этому, я одновременно кодирую URL и проверяю nil перед преобразованием строки в 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, чтобы перехватить код и посмотреть, что происходит. И пользователь (пользователи), которые столкнулись с проблемой, никогда не связывались со мной напрямую, поэтому я не могу просить более подробную информацию. Любые предложения с благодарностью.

Обновление (14/7/2009) : Похоже на такой взлом, но я добавил блок исключения вокруг подозрительной строки. Я также поднял отчет об ошибке радара (# 7031551), предлагая, чтобы код соответствовал документации.

Ответы [ 5 ]

2 голосов
/ 17 мая 2009

Я встречался с некоторыми случаями, когда API генерирует исключения, которые не должны соответствовать документации. Мое предложение должно состоять в том, чтобы убедиться (в вашем реальном коде), что tmpText действительно не равен nil (в этом случае выдается исключение, так как большинство apis, которые ожидают, что NSStrings не сохраняются в нуле). После этого просто добавьте обработку исключений вокруг него и отправьте отчет об ошибке на bugreporter.apple.com.

1 голос
/ 17 мая 2009

Стоит зарегистрировать исходное значение строки, чтобы увидеть, что является вводом для -initWithString:. Следует помнить, что -stringByAddingPercentEscapesUsingEncoding: будет экранировать только те символы, которые недопустимы в URL, они никак не зависят от контекста. Поэтому, если входная строка - «http :::: host ;:», то в ней не будет экранированных символов, и она останется недействительным URL.

1 голос
/ 17 мая 2009

Ваша строка, tmpText, должна быть как-то деформирована (что означает, что что-то в ней не соответствует RFC 2396 ). К сожалению, поскольку вы не можете получить точное содержимое этой переменной от пользователя, я не могу помочь вам понять, почему она имеет неправильный формат. См. эту публикацию на Apple Open Radar для отчета о подобном поведении. Я знаю, что отчет о передаче nil в URLWithString, но если он обрабатывает nil так же, как и любую другую искаженную строку, поведение (с исключением) может быть таким же.

Я бы посоветовал взглянуть на то, как создается newUrl, и посмотреть, сможете ли вы найти какие-либо крайние случаи, когда возможно попадание туда запрещенных персонажей. Я думаю, в этом и заключается ваша проблема.

0 голосов
/ 15 марта 2010

NSURL возвращает nil для неверно сформированных URL, NSLog вашу строку и устанавливает точки останова, чтобы точно увидеть, что передается в ваш метод создания NSURL. Если ваш URLWithString работает с жестко закодированным значением, это еще одно доказательство того, что все, что вы передаете, искажено. Будьте осторожны с stringByAddingPercentEscapesUsingEncoding и другими строковыми методами, поскольку они также могут добавить некоторую дополнительную хрень, которую может получить ваш получатель NSURL.

0 голосов
/ 18 мая 2009

Можете ли вы сделать журнал и посмотреть, что присутствует в newUrl и tmpText перед их использованием. Это должно дать вам представление о том, с чего начать.

stringByAddingPercent ... никогда не вернет ноль (если только newUrl не ноль).

URLWithString: вызов вернет ноль, если переданная ему строка искажена. Таким образом, объект url - это то, что вы должны отслеживать для нулевых проверок (перед вызовом openURL: метод)

...