c#Delegate:如何在具有潜在异常的事件(Delegate)上调用所有方法?

时间:2017-02-13 09:39:21

标签: c# events delegates

我使用System.Action作为我的代表。

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

以及其他地方

myEvent.Invoke();

现在的问题是,MyMethod1()在调用时会有一些异常。但我仍然希望在此调用期间调用MyMethod2()

怎么做?

关于潜在的例外情况: 这实际上是一个Unity问题,当一个方法注册到一个事件,并且这个方法包含gameobject交互。删除相关的MonoBehaviour时,此方法仍然存在,但是gameobject交互会抛出异常。

3 个答案:

答案 0 :(得分:4)

这是一件棘手的事情。事件处理程序不得返回值。如果您希望事情具有合理的确定性,这包括抛出异常。处理程序调用者可以对抛出的异常做些什么呢?

但是你的例子很清楚你的问题是在处理程序本身 - 修复处理程序。它不应该因为游戏对象不再存在而抛出异常!您还需要确保在适当的时间从事件中正确删除所有处理程序。听起来你的处理人员在事件中坚持不懈,因为它们应该很久就被删除了。

答案 1 :(得分: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
        }
    }

以上是一个想法 - 您可以选择以稍微不同的方式执行此操作想要删除抛出的代表。

答案 2 :(得分:0)

更好的设计是调用单个方法,并在该方法中调用您需要调用的两个方法,因为这会增加cohesion

@t3= ["", "Overview", "<span>Risks</span>", "<span>Scrumbler</span>", "Roadmap"]

}

编辑:我刚刚注意到你问题的例外部分。然后,您可以像平常一样轻松处理异常。