Как получить информацию об исключении, вызванном целью Control.Invoke

У меня есть "общий" статический метод котла, который проверяет InvokeRequired и вызывает соответствующее действие.

Если необработанное исключение возбуждается действием, трассировка стека не очень помогает, поскольку она начинается здесь. Я могу получить информацию об управлении, но это не всегда помогает. Мне было интересно, можно ли извлечь "что-то" из действия - другое, что "Цель". (Обратите внимание, что действие часто является лямбдой или анонимным делегатом...)

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

EDIT: в соответствии с этим ответом, вот новая перегрузка (также немного улучшенная)

public static void Invoke(Control ctrl, Action action, string context)
{
    if (ctrl == null)
        throw new ArgumentNullException("ctrl");
    if (action == null)
        return; //not sure it 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);
    }
}

Ответ 1

Ну, .Method.Name предоставит вам метод, который вызывается, но в случае анонимных методов /lambdas: no, not really. Созданные компилятором имена довольно непонятны, и вы не можете легко разобрать делегат IL. Лучше всего включить необязательный строковый аргумент (для целей вины, если он опущен, используйте .Method.Name).

Ответ 2

Если я правильно прочитал, вы хотите получить доступ к деталям исходного произошедшего исключения. Вы должны получить это, проверив свойство InnerException в переменной ex.