4

マルチキャストデリゲートを介して呼び出しているコードがいくつか与えられました。

そこで発生した例外をキャッチして管理する方法を知りたいのですが、それは今のところ管理されていません。与えられたコードを変更することはできません。

私は周りを見回して、GetInvocationList()を呼び出す必要があることを発見しましたが、これが役立つかどうかはよくわかりません。

4

3 に答える 3

4

を使用してコードを検討してくださいGetInvocationList

foreach (var handler in theEvent.GetInvocationList().Cast<TheEventHandler>()) {
   // handler is then of the TheEventHandler type
   try {
      handler(sender, ...);
   } catch (Exception ex) {
      // uck
   }
}   

これは私の古いアプローチであり、私が好む新しいアプローチは上記のとおりです。これは、out / refパラメーターの使用を含む呼び出しを簡単にするためです(必要な場合)。

foreach (var singleDelegate in theEvent.GetInvocationList()) {
   try {
      singleDelgate.DynamicInvoke(new object[] { sender, eventArg });
   } catch (Exception ex) {
      // uck
   }
}

これは、で呼び出されたであろう各デリゲートを個別に呼び出します

 theEvent.Invoke(sender, eventArg)

ハッピーコーディング。


イベントを処理するときは、標準のnullガードコピー'n'チェック(および場合によってはロック)を実行することを忘れないでください。

于 2011-04-21T07:09:14.510 に答える
2

マルチキャストリストに登録されているすべてのデリゲートをループして、各呼び出しをtry-catchブロックでラップしながら、各デリゲートを順番に呼び出すことができます。

それ以外の場合、例外を除いたデリゲート後のマルチキャストでの後続のデリゲートの呼び出しは中止されます。

于 2011-04-21T07:04:31.180 に答える
0

賛成の答えはイベントに対するものです。代表者は特にこの拡張メソッドを試してください。

    public static class DelegateExtensions
{
    public static void SafeInvoke(this Delegate del,params object[] args)
    {
        foreach (var handler in del.GetInvocationList())
        {
            try
            {
                    handler.Method.Invoke(handler.Target, args);
            }
            catch (Exception ex)
            {
                // ignored
            }
        }
    }
}
于 2016-02-17T15:19:39.183 に答える