【问题标题】:c# Delegate: How to invoke ALL methods on an event (Delegate) with potencial exception?c#Delegate:如何在具有潜在异常的事件(Delegate)上调用所有方法?
【发布时间】:2017-02-13 18:01:09
【问题描述】:

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

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

还有别的地方

myEvent.Invoke();

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

怎么做?

关于潜在的异常: 这实际上是一个 Unity 问题,当一个方法注册到一个事件时,这个方法包含了游戏对象的交互。当相关的 MonoBehaviour 被删除时,该方法仍然存在,但游戏对象交互会抛出异常。

【问题讨论】:

  • 您不能在事件处理程序中捕获异常吗?
  • 我可以,但我想在委托或事件代码中这样做,因为它在 Unity 中更清晰。而且我不想添加 Unity 标签,因为它实际上是纯 C# 问题。
  • 我不知道您为什么认为它“更清晰”,但这是错误的。我会在下面接受 Luaan 的回答。

标签: c# events delegates


【解决方案1】:

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

但是您的示例非常清楚地表明您的问题出在处理程序本身 - 修复处理程序。它不应该仅仅因为游戏对象不再存在而引发异常!您还需要确保在适当的时间从事件中正确删除所有处理程序。听起来您的处理程序在事件中仍然存在,而它们应该早就被删除了。

【讨论】:

    【解决方案2】:

    你可以使用GetInvocationList,而不是myEvent.Invoke

        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
            }
        }
    

    以上是一个想法 - 如果您愿意,您可以选择稍有不同的做法。想要移除抛出的委托。

    【讨论】:

    • DynamicInvoke 很方便,但也有点慢。只是要注意它可以被替换。
    【解决方案3】:

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

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

    }

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

    【讨论】:

      猜你喜欢
      • 2020-12-09
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      • 2014-09-16
      • 1970-01-01
      相关资源
      最近更新 更多