Почему мой блок Catch работает только во время отладки в Visual Studio? - PullRequest
9 голосов
/ 18 июля 2011

Код в Program.cs

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    try
    {
        Application.Run(new Form1());
    }
    catch (Exception ex)
    {
        MessageBox.Show("Blah...");
    }
}

В Form1 у меня есть кнопка с кодом throw new Exception("");.

Если я запускаю приложение из Visual Studio, то появляется мое окно сообщений(с сообщением «Бла ...»).Но если я запускаю приложение из исполняемого файла, тогда блок catch не выполняется вообще.

Почему разница?

Я использую Visual Studio 2010, .NET 4.0, Windows XP.

Ответы [ 3 ]

16 голосов
/ 18 июля 2011

Это происходит потому, что стандартная обработка исключений для приложения Windows Forms ведет себя по-разному, когда подключен отладчик Visual Studio - обычно обработчик исключений, встроенный в метод Application.Run, перехватывает необработанные исключения, так что он может выполнять такие вещи, как показывать следующий диалог:

Error dialog

Если бы разрешить создание исключения вне метода Application.Run, это предотвратило бы продолжение приложения, если пользователь нажимает «continue» (как перехватчик)находится за пределами обработчика сообщений).

Однако при отладке это отключено, предположительно, так что отладчик перейдет прямо в режим отладки при необработанном исключении, а не в показанном выше диалоговом окне.

Если вы хотите обрабатывать необработанные исключения в приложении Windows Forms, вам следует обработать Application.ThreadException Событие .В качестве альтернативы вы можете изменить это поведение с помощью Application.SetUnhandledExceptionMode метода .

Вы ни в коем случае не одиноки, будучи смущены этим:

0 голосов
/ 18 июля 2011

Я не понимаю, почему это происходит, но попробуйте перестроить решение, если у меня есть сомнения, я всегда так делаю.Это может или не может решить проблему, и вы, вероятно, уже пытались, но если у вас нет, это может решить ее для вас.

0 голосов
/ 18 июля 2011

Потому что в режиме RELEASE в данный момент должно быть показано окно сообщения, поскольку приложение будет «мертвым», и вы не можете остановить его, показывая MessageBox.В режиме DEBUG VS заботится об этом, и разрывает на строке, которая вызывает исключение.

С уважением.

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