在使用C#中的AS时出现异常

3

在编写代码时

var e = element.NextSibling as HtmlElement;

我遇到了一次无效的强制类型转换异常。我以为使用“as”关键字可以防止强制类型转换异常并返回null?因为这正是我期望的。请告诉我,如何使e为null而不是抛出异常?或者当使用“as”关键字时为什么会出现此异常?

-编辑- 更正一下,抛出异常的是element.NextSibling。很奇怪的是,在我还没有尝试进行强制类型转换时,它就抛出了一个强制类型转换异常。我不确定如何检查是否存在下一个兄弟节点。NextSibling中的错误如下:

    Message "Unable to cast COM object of type 'System.__ComObject' to interface type 'IHTMLElement'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{3050F1FF-98B5-11CF-BB82-00AA00BDCE0B}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE))."  string

2
这似乎是一个基本问题。然而,它甚至让Jon Skeet都感到困惑。+1 - ichiban
当然问题肯定是出在别的地方了... 你能提供一些上下文代码吗? - jeroenh
2
@ichiban:当我看到我的回答基本上涵盖了Lasse的回答时,我删除了它。 - Jon Skeet
1个回答

13

你确定是这个语句导致了异常吗?

如果你已经使用try/catch块包装语句来确定是它引起的异常,那么可以尝试将其拆分:

var next = element.NextSibling;
var e = next as HtmlElement;

也许异常是从 .NextSibling 内部抛出的?

无论如何,在 C# 中不可能覆盖 as 运算符,因此它应该始终执行您期望的操作,而不会抛出异常。我怀疑问题出在其他地方,但看起来是从这个位置引起的。

编辑:正如@Jon Skeet在他已删除的答案中建议的那样,我还建议您尝试在一个简短但完整的程序中复制问题,并将程序在此处发布以便我们可以尝试自己重现问题。此外,尝试在更短的代码片段中复制问题可能会为您提供有关您在主项目中遇到的具体情况的有价值见解。

根据代码判断,看起来您正在解析 HTML 代码。如果 element 是一个 HtmlElement 对象,则 .NextSibling 方法本身不包含会产生该问题的强制转换,但它确实通过接口引用调用了另一个 .NextSibling 方法,这意味着仅使用反编译工具无法告诉我涉及哪个对象。

针对更新后的问题的编辑:很遗憾,我无法帮助您解决该问题的那一部分。

看起来调用 .NextSibling 内部会检索一个 COM 对象,它认为应该实现 IHTMLElement 接口,但实际上并没有。然而,这段内部代码正在使用硬转换,因此会失败并抛出异常。

除非您能找到正在尝试解析的 HTML 代码中明显错误的地方可以加以纠正,否则我认为您别无选择,只能在至少调用 .NextSibling 的地方包装 try/catch 块以避免这种情况。

祝您好运。


这是一种可能性,但我不确定它是否会产生那种影响。我猜你是在暗示使用过时的pdb文件时,来自其他位置的异常可能看起来像来自此位置。如果这是这种情况的可行结果,那么值得深入研究。 - Lasse V. Karlsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接