我使用System.Action
作为我的代表。
public event Action myEvent;
myEvent+=MyMethod1;
myEvent+=MyMethod2;
以及其他地方
myEvent.Invoke();
现在的问题是,MyMethod1()
在调用时会有一些异常。但我仍然希望在此调用期间调用MyMethod2()
。
怎么做?
关于潜在的例外情况: 这实际上是一个Unity问题,当一个方法注册到一个事件,并且这个方法包含gameobject交互。删除相关的MonoBehaviour时,此方法仍然存在,但是gameobject交互会抛出异常。
答案 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"]
}
编辑:我刚刚注意到你问题的例外部分。然后,您可以像平常一样轻松处理异常。