【发布时间】:2009-07-13 15:46:30
【问题描述】:
我有一个尝试创建 Uri 然后清理它的方法(删除片段、排除某些域和查询字符串模式等)。该方法如下所示:
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() 抛出异常!这是堆栈跟踪:
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)
Uri.TryCreate(Uri, String, out Uri) 的文档说如果成功则返回值为True,否则返回值为False,但它对异常保持沉默。但是,Uri.TryCreate(Uri, Uri, out Uri) 的文档说:
此方法构造 URI,将 它以规范的形式,并验证 它。如果发生未处理的异常, 这个方法抓住了它。如果你想 创建一个 Uri 并获取异常使用 Uri 构造函数之一。
堆栈跟踪显示异常是在Uri.TryCreate(Uri, Uri, out Uri) 中引发的,根据文档,这不应该发生。
这是非常罕见的情况。我已经使用该代码几个月了,通过它运行了数十亿个 URL,直到现在还没有遇到问题。不幸的是,我不知道是什么组合导致了这个问题。我希望构建一个显示错误的测试用例。
这是Uri.TryCreate 中的已知错误,还是我遗漏了什么?
【问题讨论】:
-
你知道它试图解析导致失败的 URL 吗?
-
如果我知道,我会发布的。
-
使用反射器找出“TryCreate”在做什么