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

C# 如何获取有关Control.Invoke目标引发的异常的信息,c#,C#,我有一个“通用”锅炉板静态方法,用于检查InvokeRequired并相应地调用相关操作 如果操作引发未处理的异常,堆栈跟踪没有多大帮助,因为它从这里开始。我可以获得有关控件的信息,但这并不总是有多大帮助。我想知道是否有可能从行动中得到一些有用的东西——除了“目标”。(请注意,该操作通常是lambda或匿名委托…) 编辑:根据这个答案,这里是新的重载(也略有改进) 好的,.Method.Name将为您提供被调用的方法,但是对于匿名方法/lambdas:不,不是真的。编译器生成的名称相当难以理解,

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

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

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


好的,
.Method.Name
将为您提供被调用的方法,但是对于匿名方法/lambdas:不,不是真的。编译器生成的名称相当难以理解,并且您无法轻松解析委托的IL。您最好包括一个可选的字符串参数(出于责备的目的;如果省略,请使用
.Method.Name
)。

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

嗯,是的,除了异常,还有它发生的地方。Yeees,这也是我的想法。我可能会求助于它,但它有点脆弱,复制粘贴就是它的本来面目…好吧,如果你想变得非常糟糕,你可以在使用Control.Invoke之前使用StackFrame来获得它。但是这非常混乱。。。
    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);
    }
}