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

时间:2009-07-23 20:03:53

标签: c# exception

写作时

var e = element.NextSibling as HtmlElement;

我收到了无效的强制转换异常。我以为防止强制转换异常并返回null?因为那就是我想要/除外的东西。或者告诉我如何让e变为null而不是异常?或者为什么我在使用as关键字时遇到此异常?

-edit-更正它是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

1 个答案:

答案 0 :(得分: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接口,但实际上并没有。但是,这个内部代码使用的是强制转换,因此会因此异常而失败。

我认为你没有别的选择,只能在try / catch块中至少包含对.NextSibling的调用以避免这种情况,除非你能找到一些明显错误的HTML代码正试图解析你可以改为纠正。

祝你好运。