Почему try-catch в main () плохой? - PullRequest
17 голосов
/ 18 мая 2009

Может ли кто-нибудь объяснить мне, почему считается неуместным использовать метод try-catch в методе main () для отлова любых необработанных исключений?

[STAThread]
static void Main()
{
    try
    {
        Application.Run(new Form1());
    }
    catch (Exception e)
    {
         MessageBox.Show("General error: " + e.ToString());
    }
}

Я понимаю, что это плохая практика, но не знаю почему.

Ответы [ 15 ]

1 голос
/ 18 мая 2009

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

С положительной стороны, ваше приложение никогда не будет аварийно завершено!

Если это обязательное поведение, то вам нужно иметь достаточное количество журналов и отчетов, чтобы и пользователь, и вы, как разработчик, знали, что произошло, и восстанавливались или выходили как можно изящнее.

0 голосов
/ 18 мая 2009

Я мог бы дать длинное объяснение, но вам лучше просто прочитать Ответ блога команды FxCop .

0 голосов
/ 18 мая 2009

Если ваша программа пытается продолжить работу, несмотря на всеохватывающее обнаружение того, кто знает, что за нарушение допущений ниже, она находится в опасной зоне для таких вещей, как удаленная эксплуатация недостатков безопасности (переполнение буфера, повреждение кучи). Зацикливание и продолжение работы - это большой красный знак качества программного обеспечения.

Лучше всего выходить как можно быстрее, например, выход (1). Вход и выход хорошие, но немного более рискованные.

Не верите мне? Перечисление общей слабости митры (CWE) соответствует . Тесно связан его совет против отлова разыменования нулевого указателя таким образом.

0 голосов
/ 18 мая 2009

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

Это приложение WinForms? Forms.Application.Run вызывает события всякий раз, когда поток генерирует необработанное исключение. Документы MSDN пытаются объяснить это, но обработчик, который они показывают, не работает! Прочитайте обновленный пример с сайта WinForms UE.

0 голосов
/ 18 мая 2009

Я не говорю, что это плохая практика, единственное, что я хотел бы сделать иначе, это использовать встроенное событие для этого:

        Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);

        static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
        {
            MessageBox.Show(e.Exception.Message); //or do whatever...
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...