Почему вызовы вызванных методов не обрабатывают все исключения как необработанные исключения в .Net 4.0+?

1

Я заметил, что функция отладки "Just My Code"/"Break On Unhandled Exceptions" не работает при динамическом вызове метода с использованием.NET Framework 4.0 или выше. Если я изменю проект, чтобы использовать фреймворк 3.5, он работает отлично.

Учитывая этот пример приложения командной строки:

using System;

namespace InvokeFail
{
    class Program
    {
        static void Main(string[] args)
        {
            HandledExceptions();
        }
        public static void HandledExceptions()
        {
            try
            {
                Fail();
            }
            catch (NotImplementedException)
            {
                // handle it amazingly well
            }

            try
            {
                InvokeFail();
            }
            catch (NotImplementedException)
            {
                // handle it amazingly well
            }
        }

        private static void Fail()
        {
            throw new NotImplementedException();
        }

        private static void InvokeFail()
        {
            try
            {
                typeof(Program).GetMethod("Fail", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static)
                                      .Invoke(null, null);
            }
            catch (System.Reflection.TargetInvocationException ex)
            {
                throw ex.InnerException;
            }
        }
    }
}

И эти параметры отладки VS:

Изображение 174551

Изображение 174551

Вот изображение, где останавливается отладчик, и он вызывает стек: Изображение 174551

Теги:
.net-4.0
system.reflection
unhandled-exception

1 ответ

0

По-видимому, произошли целенаправленные изменения в инфраструктуре.net с версией 4.0 в будущем.

См. Здесь определение ошибки и возможной работы вокруг.

Это был просто комментарий в этом вопросе, но это имеет смысл:

Когда исключение попадает в свойство, оно не обрабатывается там, в свойстве. Invoice метода (который вызывается из PropertyInfo.GetProperty() переводит реальное исключение в исключение TargetInvocationException. Таким образом, вы не обрабатываете реальное исключение, вы обрабатываете завернутое исключение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню