почему повторно созданное исключение при нажатии кнопки не вернется к пользователю? - PullRequest
1 голос
/ 14 января 2010

У меня есть этот код:

001 private void uiButton1_Click(object sender, EventArgs e)
002 {
003     string someString = "";
004     try
005     {
006         someString = ThisMethodThrowsAnException();
007     }
008     catch (Exception)
009     {        
010         throw;
011     }
012 }

Код доходит до «броска» в улове, но стандартное диалоговое окно winforms «необработанное исключение» никогда не появляется.

ThisMethodThrowsAnException () вызывает исключение типа System.Exception. У меня есть событие, прикрепленное к Application.ThreadException. Это событие не ударил в этом случае. uiButton - это стандартная кнопка winforms. Я создал кнопку, которая генерирует исключение в своем обработчике событий, и это исключение является , перехваченным Application_ThreadException. Вся обработка происходит в одном потоке.

Для себя я не понимаю, почему этот код не привел бы к нормальному блоку исключений (который, поскольку это приложение, которое я использую только, является чем-то полезным). В этом приложении есть и другие места, где я видел стандартный диалог исключений.

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

 private void button2_Click(object sender, EventArgs e)
    {
        throw new Exception("I are broke!"); 
    }

И обработчик ThreadException, который выглядит следующим образом:

 static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
        {
            MessageBox.Show("Exception: " + e.Exception.Message); 
        }

Я использую UnhandledExceptionMode.Automatic. Когда я нажимаю uiButton1, я не получаю сообщение об исключении через Application_ThreadException. Однако, если я добавлю новое исключение броска непосредственно перед вызовом метода для ThisMethodThrowsAnException, я получу MessageBox.

Я получаю MessageBox через button2 (через Application_ThreadException).

Итак, что-то происходит в ThisMethodThrowsAnException. Единственное, о чем я могу думать, - это запуск нового потока, но это не тот случай, когда я отлаживаю его.

Если исключение произошло в другом потоке, вернется ли оно к блоку catch в uiButton1_Click?

1 Ответ

3 голосов
/ 14 января 2010

Отладчик мешает. Класс Application знает, что к программе подключен отладчик, он использует System.Diagnostics.Debugger.IsAttached (). В этом случае не использует блок try / catch вокруг цикла сообщений, и событие Application.ThreadException будет не работать.

Это довольно намеренно. Если бы блок catch был активен, вам было бы очень сложно устранить ошибки в вашей программе. Без блока catch отладчик всегда останавливается и показывает вам, что не так.

Вы можете воспроизвести поведение во время выполнения. Добавьте эту строку кода в метод Main () перед вызовом Run ():

 Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...