我有一個方法,試圖創建一個Uri然後清理它(刪除片段,排除一些域和查詢字符串模式等)。方法是這樣的:Uri.TryCreate拋出UriFormatException?
static public bool TryCreateCleanUri(Uri baseUri, string relstr, out Uri result)
{
if (!Uri.TryCreate(baseUri, relstr, out result))
{
return false;
}
return CleanupUri(result, out result);
}
這種方法一直工作好幾個月。但昨晚它失敗了。 Uri.TryCreate()拋出異常!這裏的堆棧跟蹤:
爲Uri.TryCreate(Uri, String, out Uri)
ERROR: Unhandled exception caught. Program terminating.
System.UriFormatException: Invalid URI: The hostname could not be parsed.
at System.Uri.CreateHostStringHelper(String str, UInt16 idx, UInt16 end, Flags& flags, String& scopeId)
at System.Uri.CreateHostString()
at System.Uri.GetComponentsHelper(UriComponents uriComponents, UriFormat uriFormat)
at System.Uri.CombineUri(Uri basePart, String relativePart, UriFormat uriFormat)
at System.Uri.GetCombinedString(Uri baseUri, String relativeStr, Boolean dontEscape, String& result)
at System.Uri.ResolveHelper(Uri baseUri, Uri relativeUri, String& newUriString, Boolean& userEscaped, UriFormatException& e)
at System.Uri.TryCreate(Uri baseUri, Uri relativeUri, Uri& result)
at System.Uri.TryCreate(Uri baseUri, String relativeUri, Uri& result)
文檔中說,返回值是True
如果成功,否則False
,但它是沉默異常。然而,對於Uri.TryCreate(Uri, Uri, out Uri)
文檔說:
此方法構造URI,使 它的規範形式,並驗證 它。如果發生未處理的異常,則此方法會捕獲該異常。如果您想要 創建一個Uri並獲得例外使用 Uri構造函數之一。
堆棧跟蹤顯示在Uri.TryCreate(Uri, Uri, out Uri)
中引發異常,根據文檔,該異常不應該發生。
這是非常罕見的事件。我一直在使用該代碼數月,通過它運行數十億個URL,直到現在還沒有遇到問題。不幸的是,我不知道是什麼組合導致了這個問題。我希望構建一個顯示錯誤的測試用例。
這是一個已知的錯誤Uri.TryCreate
,還是我錯過了什麼?
你知道它試圖解析導致失敗的URL嗎? – 2009-07-13 22:56:58
如果我知道,我會發布它。 – 2009-07-16 23:01:36
使用反射器查找「TryCreate」正在做什麼 – DevinB 2009-07-22 17:48:03