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
例外がスローされるたびに、次の 2 つの問題があります。
- ブラウザーに、例外が発生したというメッセージが表示されます。
- 例外に関する情報がマネージ コードに渡されません。代わりに、
RuntimeBinderException
「非デリゲート型を呼び出すことはできません」というだけで、他の情報はまったく含まれていません。これは、ここで説明されている内容と一致しないようです。私は期待していInvalidOperationException
ます。
メソッドの戻り値をキャストすることを避けようとしました:
object tmp= _myJSObject.MyMethod();
これは違いはありません。JavaScript 側でスローされる例外のタイプを変更しても効果はありません。
MyJSObject.prototype.MyMethod = function ()
{
throw "Hello Silverlight!";
}
私が今考えることができる唯一の解決策は、関数の戻り値を悪用して例外に関する情報を渡すことですが、それは私のコードをずっと醜くします...そう:
表示されている動作がドキュメントに記載されている動作と異なるのはなぜですか? それはどういうわけか私の使用と関係がありdynamic
ますか? マネージ コード内の JavaScript で発生する例外を適切に処理するにはどうすればよいですか?