В моей программе WinForms есть место, которое выбрасывает MyOwnException.
void CodeThatThrowsMyOwnException()
{
...
throw new MyOwnException("Deep Inside");
...
}
Далее в стеке есть простой блок try / catch
try
{
CodeThatThrowsMyOwnException();
}
catch (MyOwnException moe)
{
MessageBox.Show("Hit this point in the code! Hurray!");
}
MessageBox.Show("Later, alligator.");
На компьютере коллеги (под управлением VS 2008 SP1, как я) появляется диалоговое окно. На моем компьютере он никогда не ловит исключение и не отображает диалоговое окно. Когда я помещаю точку останова глубоко в коде (CodeThatThrowsMyOwnException) в строке, которая выдает исключение, она достигает точки останова в строке. Если я нажму F5 (Debug> Run), он пропустит мой блок catch и отобразит сообщение «Позже, аллигатор».
На самом деле вставляет код "void CodeThatThrowsMyOwnException () {throw new MyOwnException (" Shallow ");}" в мой код (вместо вызова моего реального кода) и буквально вызывает "CodeThatThrowsMyOwnException ();" однако в блоке try выводится сообщение в блоке catch.
Насколько я могу судить, я не создаю никаких потоков, и я искал блоки try {} catch {}, которые перехватывают все исключения, но не могут найти ни одного в вовлеченных проектах (и если они там были, почему бы этот блок catch все еще работает на машине моего коллеги?)
Как ни странно, выполнение моего кода двойным щелчком по исполняемому файлу дает мне необработанное исключение на моей машине и то же самое на компьютере моего коллеги. Это подсказка, которая заставила меня попробовать следующее:
Когда я размещаю точку останова в строке throw MyOwnException ("Deep Inside") глубоко внутри моего кода, стек вызовов содержит строку "[External Code]" между моим обработчиком исключений и местом, где я вызываю 'throw MyOwnException ( "Глубоко внутри")'. Если я помещу блок try / catch MyOwnException дальше от броска (но на этой стороне [внешнего кода] я все еще могу перехватить исключение, где бы я ни разместил блок try catch (вокруг соответствующих частей цепочки функций):
try
{
CodeChain(...);
}
catch (DrawException de)
{
MessageBox.Show("Hurray!"); // being executed, but only on the 'throw' side of the [External Code] part of the call stack
}
Однако, когда я выхожу наружу (ниже в стеке) [Внешний код], исключение не срабатывает. Это неожиданно:
try
{
treeview.Nodes.Add(treeNode); // triggers the aforementioned chain of code with MyOwnException thrown
}
catch (DrawException de) // no matter what I do, this will not handle my cursed MyOwnException
{
MessageBox.Show("Hurray!"); // not being executed
}
В этом суть моей проблемы: я не могу переместить свою ловушку в стек вызовов, потому что мне нужно выполнить много тестов (см. Ниже).
У меня есть своего рода гипотеза, которая заключается в том, что его отладчик магическим образом снимает исключение через границы потоков (или через внешний код, то есть события Windows GUI) в своем отладчике, тогда как в других трех ситуациях (мой отладчик (без 64-разрядные расширения), а также когда любая из машин запускает EXE из Windows Explorer, исключение) исключение действительно не обрабатывается в этом потоке.
Так как мне поймать это исключение? Перестройте всю мою систему, чтобы избежать использования treeview.AfterSelect? Ясно, что я не понимаю ограничения исключений.
Потенциальная проблема?
- У меня есть делегат, чтобы моя система была модульной и многоразовой. Можно ли создавать исключения «через» делегата через границы модуля?
Чего я пытаюсь достичь (Испытательный жгут) и зачем мне нужны исключения
Я использую это в автоматизированном тестовом жгуте. Мне нужно исправить некоторые действительно сложные логические / алгоритмические ошибки в сложной системе графического интерфейса, воспроизводя сценарии действий (текстовые файлы), которые находят эти исключительные обстоятельства и сужают проблему. (Вероятно, в моей программе нет хорошего обходного пути с точки зрения переписывания или рефакторинга проекта: мне нужно отловить эти исключения на этом этапе QA, исправить ошибки (сложные алгоритмические особые случаи) перед отправкой, чтобы я не подвергать моих пользователей таким программам с ошибками. Я не использую исключения для экзотического потока управления для развлечения (ср. Int32.Parse).)