2017-02-13 11 views
-1

私は代理人としてSystem.Actionを使用します。呼び出されたときc#デリゲート:ポテンシャル例外を持つイベント(デリゲート)ですべてのメソッドを呼び出す方法は?

public event Action myEvent; 
myEvent+=MyMethod1; 
myEvent+=MyMethod2; 

そして、どこか別の場所

myEvent.Invoke(); 

今問題がある、MyMethod1()意志somethimesは例外があります。しかし、私はまだこの呼び出し中にMyMethod2()を呼びたいと思っています。

どうすればよいですか?

ポテンシャル例外について: これは実際にはイベントに登録されたメソッドで、このメソッドにはゲームオブジェクトの操作が含まれているUnityの問題です。関連するMonoBehaviourが削除されても、このメソッドは存在しますが、ゲームオブジェクトのやりとりは例外をスローします。

+4

イベントハンドラ内で例外を捕捉できませんか? –

+0

私は可能ですが、デリゲートやイベントコードでそれをやりたいのですが、これはUnityでより明確になっているからです。 Unityタグを追加したくないのは、実際には純粋なC#の質問だからです。 – cdytoby

+1

私はあなたがなぜそれが「より明瞭」だと思うのか分かりませんが、間違っています。私は下のLuaanの答えに行くだろう。 –

答えて

2

むしろよりmyEvent.Invoke、あなたはGetInvocationListを使用することができます。

foreach(var dele in myEvent.GetInvocationList()) 
    { 
     try 
     { 
      dele.DynamicInvoke(); 
     } 
     catch(Exception e) 
     { 
      //If possible, change the above type to be more specific 
      //Also, do *something* here - at least log it somewhere 
      //Empty catch blocks are evil to debug and reason about 
     } 
    } 

上記1つのアイデアです - あなたは、例えば、あなたならば若干異なるそれを行うことを選択することができスローするデリゲートを削除したい

+0

DynamicInvokeは便利ですが、少し遅いです。それが置き換えられることに注意するだけです。 –

4

これは難しいことの1つです。イベントハンドラは値を返さないでください。これには、物事を合理的に決定論的にするために、例外を投げることも含まれます。ハンドラの呼び出し側が実際に例外がスローされるのは何ですか?

しかし、あなたの例では、問題がハンドラ自体にあることが非常にはっきりしています。ハンドラを修正してください。ゲームオブジェクトが存在しなくなったため例外がスローされることはありません!また、適切なタイミングですべてのハンドラがイベントから適切に削除されていることを確認する必要があります。あなたのハンドラは、長い間削除されていたはずのイベントに残っているようです。

0

より良い設計は、単一のメソッドを呼び出すことであり、そのメソッド内で呼び出す必要のある2つのメソッドを呼び出すと、cohesionが増えます。

myEvent+=myEvent_handler 

void myEvent_handler() 
{ 
    try 
    { 
    MyMethod1(); 
    } 
    catch (Exception ex) 
    { 
    //handle it 
    } 
    try 
    { 
    MyMethod2(); 
    } 
    catch (Exception ex) 
    { 
    //handle it 
    } 

}

編集:私はちょうどあなたの質問の例外部分に気づきました。通常と同様に例外を簡単に処理できます。

関連する問題