Не, сейчас StackOverflow нельзя словить ни в рабочем потоке, ни в главном потоке приложения. В fw 1.x можно было это делать, чтобы выполнить т.н. recover, но потом решили отказаться от этой порочной практики — потому что разработчики в основном «отрубали себе пальцы» такой тонкой острой фичей ).
Можно вернуться к такому поведению, если подшаманить конфиги:
<system>
<<legacyUnhandledExceptionPolicy enabled=«1»/></runtime>
</system>
Ох, я когда-то напарился с реализацией очень специфичного ThreadPool'а.
В итоге пришлось адаптировать задачу под стандартный BCL'ный, в итоге вышла асинхронная конфетка. Кстати помимо CER, мс реализовала ещё очень вкусные high performance сокеты (класс SocketAsyncEventArgs).
Кстати, по поводу StackOverflow — его нельзя поймать, но можно гарантировать очистку ресурсов в случае, если оно вдруг произойдет. Постараюсь написать следующим постом.
Не, тут никакой расширяемости. Если вы посмотрите внутрь finally, то увидите, что jitt генерит для него stack unwind код. В fw версии > 1.x этот unwind монолитен, в 1.x был необходим еще и PrepareCon...(), чтобы «кристаллизовать» код — т.к. в 1.x была другая стратегия выброса exceptions из блока finally.
P.S. C# прекрасно расширяем через аттрибуты, Nemerle — еще и через макросы.
Не, на самом деле я разговаривал с одним MVP, он говорит — M$ набирает людей по принципу «понравился-не понравился», а потом натаскивает его на нужную область.
Интересная задачка: повышаем стабильность (robustness) приложений (ч. 2)