yigal_s: (Default)
[personal profile] yigal_s
В кои-то веки я дорвался до GUI.

Удачным решением порадовал Микрософт программистов новой 64-битной платформы.
Теперь, если окно обрабатывает оконное сообщение, пришедшее из другой аппликации или даже из другого треда той же аппликации, и при этой обработке случается исключение (ну, например, такая мелочь как Access Violation), то аппликация пользователя вовсе не крешится, а продолжает себе работать как ни в чем не бывало.

Подробнее - исключение долетает до участка кода, пробрасывающего в окно "внешние" сообщения, и там окончательно поглощается, вообще не долетая до основного кода аппликации. Излишне говороить, что при поглощении UnhandledExceptionFilter не вызывается.

Кажется, подобной надежностью (толерантностью к исключениям) обладали раньше и COM сервера, теперь же и обычные пользовательские апплкации 64-х битной платформы. К сожалению, если оконное сообщение было послано тем же самым тредом, как это обычно бывает в GUI-программировании, то аппликация всё-таки может закрешиться, так как исключение уже никто по дороге не словит. Это может создать ложное впечатление о неработоспособности аппликации у QA и даже конечного пользователя. Надеюсь, в будущих версиях этот недочет будет исправлен.

Date: 2008-11-28 08:35 pm (UTC)
From: [identity profile] s1m.livejournal.com
Like with any other technology, there are good parts and there are bad parts. I've seen .NET GUI apps die to a call of a web service that wasn't in sync with its WSDL description. Without a message, error, or anything. The whole app would be just gone as if someone killed the process.

On the other hand, the GUI part is certainly done MUCH better than the networking part. Everything ASP.NET stack related is just ridiculously slow and crappy.

BTW, If you want to catch all unhanded exceptions in a GUI app, there are at least 3 ways to do so:

1. AppDomain.CurrentDomain.UnhandledException event
2. Application.ThreadException event
3. try/catch over Application.Run call

Using those you can ensure that your application will never crash without a proper response to it.