Здесь код, воспроизводящий поведение, которое я ожидаю получить:
static void Main(string[] args)
{
// try // #2
{
string x = null; // #1
AssertNotNull(x, nameof(x));
}
// catch (ArgumentNullException) { } // #2
Console.WriteLine("Passed.");
Console.ReadKey();
}
[DebuggerHidden]
public static void AssertNotNull<T>(T arg, string argName) where T : class
{
if (arg == null)
throw new ArgumentNullException(argName);
}
Поведение одинаково для любого VS, начиная с VS2008 (не проверял более ранние версии).
Если вы запустите его под отладкой (используя стандартные параметры отладки), вам не разрешается продолжать работу до тех пор, пока вы не исправите код (используя EnC). Удар F5 будет просто повторять утверждение из-за [DebuggerHidden]
и комбинации "Unwind stack on unhandled exception" (настройка включена по умолчанию).
Чтобы исправить код, просто замените строку # 1 на object x = ""
, установите для нее следующий оператор и снова нажмите F5.
Теперь включите "break when throw" для исключения ArgumentNullException и раскомментируйте строки, помеченные # 2. Изменение поведения: вы снова остановились на утверждении, но стек не разматывается (легко проверить с помощью окна CallStack). F5 будет продолжаться с места, где было исключено исключение.
Хорошо, так... теперь вопрос: Есть ли способ включить автоматическое раскручивание стека при нарушении обработанных исключений?
Скрытая опция VS, существующее расширение или (возможно) API, который может использоваться из моего собственного расширения?
UPD: Чтобы прояснить вопрос: я хочу сломать строку с неудачным утверждением, отредактировать код с помощью редактирования и продолжить, установить следующий оператор в фиксированный код и продолжить выполнение.
Как это работает, если исключение не попало в стек.
UPD2 Как было предложено Хансом Пассантом: опубликовано предложение о UserVoice. Не стесняйтесь проголосовать:)