我无法向大量使用 Silverlight - JavaScript 互操作性的现有代码添加适当的异常处理。在这种情况下,我的 JavaScript 可能会引发我想在 Silverlight 中有意义地处理的异常。
在 Silverlight 中,我创建了一个 JavaScript 对象的实例,然后我在该对象上调用了一个方法:
public class MyWrapper
{
dynamic _myJSObject;
public MyWrapper()
{
_myJSObject = HtmlPage.Window.CreateInstance("MyJSObject");
}
public int MyMethod()
{
try
{
int result = (int)_myJSObject.MyMethod();
}
catch (Exception ex)
{
// I want to add meaningful exception handling here
}
}
}
每当MyJSObject.MyMethod
抛出异常时,都会出现两个问题:
- 浏览器显示发生异常的消息。
- 有关异常的信息不会传递给我的托管代码。相反,我得到一个
RuntimeBinderException
只是说“不能调用非委托类型”并且不包含任何其他信息。这似乎与这里描述的不符;我期待一个InvalidOperationException
.
我试图避免强制转换方法的返回值:
object tmp= _myJSObject.MyMethod();
这没什么区别。更改 JavaScript 端抛出的异常类型也没有效果。
MyJSObject.prototype.MyMethod = function ()
{
throw "Hello Silverlight!";
}
我现在能想到的唯一解决方案是滥用函数的返回值来传递有关异常的信息,但这会使我的代码变得更加丑陋......所以:
为什么我看到的行为与文档中描述的不同?它与我使用dynamic
某种方式有关吗?如何在我的托管代码中正确处理 JavaScript 中发生的异常?