代码之家  ›  专栏  ›  技术社区  ›  Benjol

如何获取有关Control.Invoke的目标引发的异常的信息

c#
  •  2
  • Benjol  · 技术社区  · 16 年前

    我有一个“通用的”锅炉板静态方法,用于检查invokeRequired并相应地调用相关的操作。

    如果操作引发了未处理的异常,那么堆栈跟踪就没有多大帮助,因为它从这里开始。我可以得到关于控制的信息,但这并不总是有什么帮助。我想知道是否有可能从行动中得到“有用的东西”——另一个“目标”。(请注意,该操作通常是lambda或匿名委托…)

        public static void Invoke(Control ctrl, Action action)
        {
            if (ctrl == null)
                throw new ArgumentNullException("ctrl");
            if (action == null)
                return;
    
            var invokeRequired = ctrl.InvokeRequired;
            try
            {
                if (ctrl.InvokeRequired)
                    ctrl.Invoke(action);
                else
                    action();
            }
            catch (Exception ex)
            {
                throw new Exception(String.Format("Invoke error, ctrl={0}, action Target={1}", ctrl.Name, action.Target), ex);
            }
        }
    

    编辑:根据这个答案,这里是新的过载(也有轻微的改进)

    public static void Invoke(Control ctrl, Action action, string context)
    {
        if (ctrl == null)
            throw new ArgumentNullException("ctrl");
        if (action == null)
            return; //not sure it's worththrowing an exception here...
    
        var invokeRequired = ctrl.InvokeRequired;
        try
        {
            if (invokeRequired)
                ctrl.Invoke(action);
            else
                action();
        }
        catch (Exception ex)
        {
            var ps = invokeRequired ? "" : " - has the target control been initialised?";
            var errmsg = String.Format("Invoke error, ctrl={0}, action Target={1}, context={2}{3}", ctrl.Name, action.Target, context, ps);
            throw new Exception(errmsg, ex);
        }
    }
    
    2 回复  |  直到 16 年前
        1
  •  1
  •   Marc Gravell    16 年前

    好, .Method.Name 将为您提供被调用的方法,但在匿名方法/lambda的情况下:不,不是真的。编译器生成的名称是相当难以理解的,您不能轻松地解析委托的IL。您的最佳选择可能是包含可选的字符串参数(出于责备目的;如果省略,请使用 方法名称 )

        2
  •  1
  •   Dave Cluderay    16 年前

    如果我读得正确,您将希望访问发生的原始异常的详细信息。您应该能够通过检查ex变量的innerException属性来获得它。