2009-05-17 37 views
4

簡而言之,[NSURL URLWithString:]似乎引發異常。根據文件「如果字符串格式不正確,返回零」。沒有提到在任何情況下引發的例外情況。除此之外,我將URL編碼並在將字符串轉換爲URL之前檢查nilNSURL URLWithString:引發異常

任何人都可以提供任何意見,可能是哪個異常,或者在轉換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),建議代碼應該與文檔匹配。

+0

斯蒂芬,你有沒有找到任何特定的字符串造成這種情況? –

+0

@MikeAbdullah恐怕不是。 '@ try'模塊起作用了,所以我沒有看到崩潰,並且應用程序沒有「打電話回家」。蘋果在iOS 5 beta 2發佈時關閉了雷達,因此它可能會被修復... –

回答

2

我遇到了一些API引發不應該根據文檔的異常的場合。我的建議是確保(在你的實際代碼中)tmpText真的不是零(在這種情況下拋出一個異常,因爲大多數apis期望NSStrings不是零)。之後,只需添加異常處理並向bugreporter.apple.com提交錯誤報告。

1

您的字符串tmpText必須以某種方式變形(意思是它不符合RFC 2396)。不幸的是,由於您無法從用戶那裏獲得該變量的確切內容,所以我無法幫助您弄清楚爲什麼它變得格格不入。請參閱蘋果公司開放式雷達上的this文章,以獲取類似行爲報告。我知道該報告是關於將nil轉換爲URLWithString,但如果它的處理nil與任何其他格式錯誤的字符串相同,則行爲(拋出異常)可能會相同。

我建議看看如何創建newUrl,看看你是否可以找到任何邊界情況下,可能會有不允許的字符進入。我的猜測是你的問題在哪裏。

+0

雷達報告確實看起來很熟悉!感謝您的鏈接。 –

1

值得記錄字符串的原始值以查看-initWithString:的輸入是什麼。有一點需要注意的是,-stringByAddingPercentEscapesUsingEncoding:只能轉義在URL中非法的字符,它們不以任何方式對上下文敏感。因此,如果輸入字符串是'http ::::主機;:',那麼它不會有任何字符轉義,並將保持無效的URL。

+0

你認爲使用CFURLCreateStringByAddingPercentEscapes而不是stringByAddingPercentEscapes:會有幫助嗎?我最終在代碼的某些部分使用了它。 –

+1

使用CF方法您唯一可以獲得的是您可以指定合法URL字符的列表以進行轉義,這在您構建表單編碼的參數列表或將用戶名/密碼信息(可能會包含URL格式化字符)到您自己設計的URL中。 在處理用戶輸入時,通常最好單獨要求組件,或者修剪輸入的URL字符串的標準部分以確保您具有有效的主機/路徑配對。然後,您可以使用CF方法在將這些組件串聯在一起之前進行消毒。 –

0

在使用它們之前,您可以做一個日誌並查看newUrl和tmpText中存在的內容。這應該讓你知道從哪裏開始尋找。

stringByAddingPercent ...將不會返回一個零(除非newUrl爲零)。

如果傳遞給它的字符串格式不正確,則URLWithString:call將返回nil。因此,url對象是你應該注意的零檢查(在調用openURL:方法之前)

+0

如果URLWithString:正在返回零,一切都會好起來的 - 我在代碼中稍後檢查。不幸的是它拋出了一些未知的異常。 –

0

NSURL返回nil用於格式錯誤的URL,NSLog記錄您的字符串並設置斷點以準確地查看傳遞給您的NSURL創建方法的內容。如果你的URLWithString與一個硬編碼值一起工作,這進一步證明了你傳遞的任何東西都是畸形的。請注意stringByAddingPercentEscapesUsingEncoding和其他字符串方法,因爲它們也可能會添加一些額外的廢話,您的NSURL收件人可能會窒息。