Я заметил, что функция отладки "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:
Вот изображение, где останавливается отладчик, и он вызывает стек:
По-видимому, произошли целенаправленные изменения в инфраструктуре.net с версией 4.0 в будущем.
См. Здесь определение ошибки и возможной работы вокруг.
Это был просто комментарий в этом вопросе, но это имеет смысл:
Когда исключение попадает в свойство, оно не обрабатывается там, в свойстве. Invoice метода (который вызывается из PropertyInfo.GetProperty() переводит реальное исключение в исключение TargetInvocationException. Таким образом, вы не обрабатываете реальное исключение, вы обрабатываете завернутое исключение.