В книге Juval Lowy "Programming WCF Services" я встретил следующее замечание:
Джеффри Рихтер пишет во втором издании "CLR via C#", что
То есть, по этому утверждению Рихтера, при возникновении необработанного исключения в отдельном потоке завершается только поток, в котором возникло исключение. Рушится ли домен? Завершается ли процесс? О каком исключении из правил для ThreadAbortException говорит Лёви?
В главе 21 второго издания Рихтера говорится о том, что происходит с потоками при выгрузке appDomain с помощью метода Unload():
- потоки приостанавливаются
- во всех потоках, выполняющих (или тех, что в скором времени могут его выполнять) генерируется исключение ThreadAbortException, инициируя выполнение всех блоков finally.
- если этот экземпляр ThreadAbortException остался необработанным, исключение проглатывается, поток завершается, но приложению в целом разрешено продолжить работу.
Далее, цитирую:
Это уже более похоже на то, о чём говорит Лёви – исключение ThreadAbortException, генерируемое в потоках при выгрузке домена, не уничтожает процесс, даже не будучи перехваченным.
Более подробное описание этого самого "стандартного процесса" при возниконовении необработанного исключения пока найти не удалось, буду смотреть ещё в четвёртой редакции.
"In traditional .NET programming , any unhandled exception (Except ThreadAbortException) immediately terminated the AppDomain (and thus, often the process) in which it occurred."Потом в отзывах к книге автора упрекнули в незнании .NET, поэтому я решил разобраться прав ли автор хотя бы в этом утверждении, для чего решил не экспериментировать, а обратиться за разъяснениям к авторитетам:
Джеффри Рихтер пишет во втором издании "CLR via C#", что
"Обнаружив в процессе поток с необработанным исключением, CLR немедленно уничтожает этот поток."
То есть, по этому утверждению Рихтера, при возникновении необработанного исключения в отдельном потоке завершается только поток, в котором возникло исключение. Рушится ли домен? Завершается ли процесс? О каком исключении из правил для ThreadAbortException говорит Лёви?
В главе 21 второго издания Рихтера говорится о том, что происходит с потоками при выгрузке appDomain с помощью метода Unload():
- потоки приостанавливаются
- во всех потоках, выполняющих (или тех, что в скором времени могут его выполнять) генерируется исключение ThreadAbortException, инициируя выполнение всех блоков finally.
- если этот экземпляр ThreadAbortException остался необработанным, исключение проглатывается, поток завершается, но приложению в целом разрешено продолжить работу.
Далее, цитирую:
Такое поведение отличается от стандартного, потому что в любых других ситуациях при возникновении необработанного исключения CLR уничтожает процесс.
Это уже более похоже на то, о чём говорит Лёви – исключение ThreadAbortException, генерируемое в потоках при выгрузке домена, не уничтожает процесс, даже не будучи перехваченным.
Более подробное описание этого самого "стандартного процесса" при возниконовении необработанного исключения пока найти не удалось, буду смотреть ещё в четвёртой редакции.
No comments:
Post a Comment