Почему исключения AppDomain неизменно завершают приложение?

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

7
задан Community 23 May 2017 в 12:33
поделиться

3 ответа

Проведя еще несколько поисков в Google, я нашел очень интересное объяснение той же проблемы, которую описал Джефф Этвуд в своем блоге .

Привет всем , Извините за путаницу. Такое поведение на самом деле является дизайном, хотя дизайн иногда может быть немного запутанным.

Первое, что нужно понять, это то, что событие UnhandledException не является «обработчиком» необработанного исключения. Регистрация для события, вопреки тому, что говорится в документации :-(, не вызывает обработки необработанных исключений. (С тех пор они не будут необработанными, но я уже остановлюсь на круговой аргументации ...) Событие UnhandledException просто уведомляет вас о том, что исключение не было обработано , на случай, если вы хотите попытаться сохранить состояние до того, как ваш поток или приложение умрет. FWIW, я зарегистрировал ошибку, чтобы получить документы исправлено.

Чтобы усложнить ситуацию, в версиях 1.0 и 1.1 необработанное исключение не всегда означало, что ваше приложение умирает. Если необработанное исключение произошло в чем-либо, кроме основного потока или потока, который начал свою жизнь в неуправляемом коде, среда CLR перехватила исключение и разрешила вашему приложению продолжить работу. В целом это было злом, потому что часто происходило, например, то, что потоки ThreadPool молча умирали, один за другим, до тех пор, пока ваше приложение фактически не переставало выполнять какую-либо работу. Выяснить причину такого отказа было практически невозможно. Возможно, поэтому Джефф думал, что это работало раньше ... он просто всегда видел сбои в неосновных потоках.

В версии 2.0 необработанное исключение в любом потоке приведет к остановке приложения. Мы обнаружили, что отладить сбои намного проще, чем отладить зависания или проблему с тихой остановкой работы, описанную выше.

Кстати, на моем 1. 1 машина в примере из MSDN имеет ожидаемый результат; просто вторая строка не появляется до тех пор, пока вы не подключите отладчик (или нет). В версии 2 мы перевернули все так, что событие UnhandledException срабатывает до подключения отладчика, что, похоже, является тем, чего ожидает большинство людей.

Джонатан Келджо Исключения CLR PM Джонатан Келджо, 18 февраля 2005 г., 22:02

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

Более того. , Меня очень интересует способ отключить диалоговое окно отладки .NET JIT только для моего приложения (без отключения его для всей машины, как показано здесь )

8
ответ дан 6 December 2019 в 19:40
поделиться

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

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

3
ответ дан 6 December 2019 в 19:40
поделиться

Помогает ли это вообще?

Улучшено поведение необработанных исключений в .NET 2.0

Кроме того, этот код, кажется, «тихо умирает». Вы ищете что-нибудь еще?

using System;

namespace UnhandledException
{
    class Program
    {
        static void Main(string[] args)
        {
            AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException;

            throw new NotImplementedException();
        }

        static void CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            Exception exception = (Exception)e.ExceptionObject;
            System.Console.WriteLine("exception=[" + exception.ToString() + "]");

            Environment.Exit(-1);
        }   
    }
}
2
ответ дан 6 December 2019 в 19:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: