У меня возникли проблемы с добавлением правильной обработки исключений к существующему коду, который сильно использует совместимость Silverlight - JavaScript. В этом случае мой JavaScript может генерировать исключение, которое я хочу осмысленно обрабатывать в Silverlight.Обработка исключений 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
, который просто говорит «Невозможно вызвать тип без делегата» и не содержит никакой другой информации. Это не похоже на то, что описано here; Я ожидал быInvalidOperationException
.
Я попытался избежать бросить возвращаемое значение метода:
object tmp= _myJSObject.MyMethod();
Это не имеет никакого значения. Изменение типа исключения, созданного на стороне JavaScript, также не влияет.
MyJSObject.prototype.MyMethod = function()
{
throw "Hello Silverlight!";
}
Единственное решение, которое я могу думать сейчас злоупотребляет возвращаемое значение функции для передачи информации об исключении, но это сделает мой код много уродливый ... так:
Почему поведение, которое я вижу, отличается от того, что описано в документации? Это связано с моим использованием dynamic
? Как я могу правильно обрабатывать исключения, которые встречаются в JavaScript в моем управляемом коде?