Гарантии безопасности исключений в GUI
От: Termit  
Дата: 17.12.07 12:00
Оценка:
Открыл для себя гарантии безопасности исключений и захотел их использовать в GUI приложении. Насколько я понял концепцию, надо, как минимум, гарантировать что все исключения должны быть перехвачены. Из UI вызывается 90% кода, соот-но надо наставить во всех UI callback-ах try/catch? Есть еще какие нибудь подходы? Глобальный обработчик не подходит потому что хочется продолжить выполнение программы.
Re: Гарантии безопасности исключений в GUI
От: Blazkowicz Россия  
Дата: 17.12.07 12:30
Оценка:
Здравствуйте, Termit, Вы писали:

T>Открыл для себя гарантии безопасности исключений и захотел их использовать в GUI приложении. Насколько я понял концепцию, надо, как минимум, гарантировать что все исключения должны быть перехвачены. Из UI вызывается 90% кода, соот-но надо наставить во всех UI callback-ах try/catch? Есть еще какие нибудь подходы? Глобальный обработчик не подходит потому что хочется продолжить выполнение программы.


У вас какие-то слишком сложные представления об исключениях. Исключения это всего лишь механизм передачи управления, упрощающий выход их методов в случае ошибочных и близких к ним ситуаций.
Re[2]: Гарантии безопасности исключений в GUI
От: Cyberax Марс  
Дата: 17.12.07 12:34
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>У вас какие-то слишком сложные представления об исключениях. Исключения это всего лишь механизм передачи управления, упрощающий выход их методов в случае ошибочных и близких к ним ситуаций.

Не сложные, скорее правильные

Тут еще дело затруднено языком — если это С++, то еще надо узнать какая библиотека используется. В теории, можно попробовать поставить try..catch в методе, вызывающем обработчики событий.
Sapienti sat!
Re: Гарантии безопасности исключений в GUI
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 17.12.07 12:36
Оценка: +1 -1
Здравствуйте, Termit, Вы писали:

T>Открыл для себя гарантии безопасности исключений и захотел их использовать в GUI приложении. Насколько я понял концепцию, надо, как минимум, гарантировать что все исключения должны быть перехвачены. Из UI вызывается 90% кода, соот-но надо наставить во всех UI callback-ах try/catch? Есть еще какие нибудь подходы? Глобальный обработчик не подходит потому что хочется продолжить выполнение программы.

А поделитесь-ка с нами источником почерпнутой вами мудрости, ссылку в студию! А то складывается ощущение, что то ли вас обманули жестоко, то ли вы как-то превратно поняли материал.

Как минимум, что уже видно:
Re[3]: Гарантии безопасности исключений в GUI
От: Termit  
Дата: 17.12.07 12:41
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, Blazkowicz, Вы писали:


B>>У вас какие-то слишком сложные представления об исключениях. Исключения это всего лишь механизм передачи управления, упрощающий выход их методов в случае ошибочных и близких к ним ситуаций.

C>Не сложные, скорее правильные

C>Тут еще дело затруднено языком — если это С++, то еще надо узнать какая библиотека используется. В теории, можно попробовать поставить try..catch в методе, вызывающем обработчики событий.


Язык С++, библиотека WTL. Т.е вы предлагаете поставить try/catch в главной функции-обработчике сообщений?
Re[2]: Гарантии безопасности исключений в GUI
От: Termit  
Дата: 17.12.07 12:44
Оценка:
Здравствуйте, rsn81, Вы писали:

R>А поделитесь-ка с нами источником почерпнутой вами мудрости, ссылку в студию! А то складывается ощущение, что то ли вас обманули жестоко, то ли вы как-то превратно поняли материал.


R>Как минимум, что уже видно:

Источник — Новые сложные задачи на C++, Автор: Герб Саттер
т.е надо разумно перехватывать исключения на уровне бизнес-логики, а если что то пролезло в UI то это уже ошибка, которая должна быть устранена во время отладки?
Re[4]: Гарантии безопасности исключений в GUI
От: Cyberax Марс  
Дата: 17.12.07 12:48
Оценка: 2 (1) +1
Здравствуйте, Termit, Вы писали:

C>>Тут еще дело затруднено языком — если это С++, то еще надо узнать какая библиотека используется. В теории, можно попробовать поставить try..catch в методе, вызывающем обработчики событий.

T> Язык С++, библиотека WTL. Т.е вы предлагаете поставить try/catch в главной функции-обработчике сообщений?
Да, сильно лучше не получится.

И при перехвате исключения показывать диалог, предлагающий послать автору сообщение об ошибке (я для этого использовал CrashRpt: http://code.google.com/p/crashrpt/ ). По идее, самым разумным действием после перехвата будет выключить программу, постаравшись сохранить данные. Но можно и попробовать продолжить — это возможно сделать.
Sapienti sat!
Re[2]: Гарантии безопасности исключений в GUI
От: Cyberax Марс  
Дата: 17.12.07 12:51
Оценка: 1 (1)
Здравствуйте, rsn81, Вы писали:

R>А поделитесь-ка с нами источником почерпнутой вами мудрости, ссылку в студию! А то складывается ощущение, что то ли вас обманули жестоко, то ли вы как-то превратно поняли материал.

Это из С++, есть такая фича — гарантии по исключениям. Их там четыре штуки: no throw (метод никогда не бросит исключение), weak (метод может бросить исключение, после исключения объект безопасно может быть только уничтожен), strong (метод может бросить исключение, при броске происходит откат изменений, объект можно использовать дальше), none (никаких гарантий).

Видимо, человеку захотелось сделать своему коду хоть какие-то гарантии
Sapienti sat!
Re: Гарантии безопасности исключений в GUI
От: MozgC США http://nightcoder.livejournal.com
Дата: 17.12.07 14:19
Оценка: 1 (1) +2
Уже недавно кому-то говорил, повторюсь:
Возможно Вам будет интересно (если Вы еще этого не сделали) почитать МакКоннелла — Совершенный Код, кажется в главе 8 про обработку ошибок, начинающему/среднеуровневому разработчику может быть полезно.
Re[3]: Гарантии безопасности исключений в GUI
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 17.12.07 14:30
Оценка:
Здравствуйте, Termit, Вы писали:

T>Источник — Новые сложные задачи на C++, Автор: Герб Саттер

Тогда пас: раз Cyberax говорит, что в C++ такой изврат обоснован.

T>т.е надо разумно перехватывать исключения на уровне бизнес-логики, а если что то пролезло в UI то это уже ошибка, которая должна быть устранена во время отладки?

По-крайней мере в управляемых платформах практически все исключения (кроме специальных) — это не ошибка, а информационное сообщение, на которое надо соответствующим образом реагировать. Уже писали тут: Re: Гарантии безопасности исключений в GUI
Автор: Blazkowicz
Дата: 17.12.07
Re[3]: Гарантии безопасности исключений в GUI
От: Sergey Россия  
Дата: 17.12.07 15:59
Оценка: 2 (1)
> R>А поделитесь-ка с нами источником почерпнутой вами мудрости, ссылку в студию! А то складывается ощущение, что то ли вас обманули жестоко, то ли вы как-то превратно поняли материал.
>
> R>Как минимум, что уже видно: >
> Источник — Новые сложные задачи на C++, Автор: Герб Саттер
> т.е надо разумно перехватывать исключения на уровне бизнес-логики, а если что то пролезло в UI то это уже ошибка, которая должна быть устранена во время отладки?

Не обязательно, все сильно зависит от контекста. Если на уровне бизнес-логики можешь дописать к исключение что-нибудь умное, например, поймав my_security_wrapper::access_deined, вместо просто e.what() выдать в качестве сообщения об ошибке string("Открытие файла xxx обломилось по причине: ") + e.what(), то лучше так и сделать. А если и без этого юзеру будет понятно, в чем проблема, то пускай себе летит на самый верх. Кроме того, понятное дело, что в ряде случаев возникновение исключения означает, что дальнейшие операции с данным объектом будут приводить либо к дальнейшим исключениям, либо вообще к AV — в таких случаях, естественно, перехват исключения на уровне БЛ обязателен, поскольку необходимо уничтожить сам объект, отвечающий за взаимодействие с ним GUI, а сообщение об ошибке показать позднее.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[3]: Гарантии безопасности исключений в GUI
От: Sergey Chadov Россия  
Дата: 17.12.07 16:58
Оценка: +1
Здравствуйте, Cyberax, Вы писали:

C>Это из С++, есть такая фича — гарантии по исключениям. Их там четыре штуки: no throw (метод никогда не бросит исключение), weak (метод может бросить исключение, после исключения объект безопасно может быть только уничтожен), strong (метод может бросить исключение, при броске происходит откат изменений, объект можно использовать дальше), none (никаких гарантий).


А причем здесь С++?
--
Sergey Chadov

... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[4]: Гарантии безопасности исключений в GUI
От: Cyberax Марс  
Дата: 18.12.07 02:50
Оценка:
Здравствуйте, Sergey Chadov, Вы писали:

C>>Это из С++, есть такая фича — гарантии по исключениям. Их там четыре штуки: no throw (метод никогда не бросит исключение), weak (метод может бросить исключение, после исключения объект безопасно может быть только уничтожен), strong (метод может бросить исключение, при броске происходит откат изменений, объект можно использовать дальше), none (никаких гарантий).

SC>А причем здесь С++?
В общем и целом — ни при чем. Но во многих управляемых средах (в JVM и CLI — точно), декларировано, что в любой момент может вылететь исключение ("ошибка VM", например). Так что часть гарантий уже, строго говоря, сделать не получится.
Sapienti sat!
Re: Гарантии безопасности исключений в GUI
От: _FRED_ Черногория
Дата: 04.01.08 11:34
Оценка:
Здравствуйте, Termit, Вы писали:

T>Открыл для себя гарантии безопасности исключений и захотел их использовать в GUI приложении. Насколько я понял концепцию, надо, как минимум, гарантировать что все исключения должны быть перехвачены.


Перечитал "Вопросы и приёмы безопастности исключений" из указанного
Автор: Termit
Дата: 17.12.07
источника. На основании чего был сделан вывод о том, что "все исключения должны быть перехвачены"? Должны быть перехвачены исключения, которые описаны в контракте (явном или не явном) вызываемых методов.

T>Из UI вызывается 90% кода, соот-но надо наставить во всех UI callback-ах try/catch? Есть еще какие нибудь подходы?


Если UI работает через очередь сообщений, то обработчик исключения можно выставить над обработчиком сообщения, перехватив, таким образом, ошибки во всех обработчиках всех (или только нужных) сообщений. Насколько просто и удобно это сделать зависит от используемой GUI-библиотеки. Про WTL не знаю.

T>Глобальный обработчик не подходит потому что хочется продолжить выполнение программы.


Такой "глобальный" обработчик, как сказано выше, позволит "продолжить выполнение".
Help will always be given at Hogwarts to those who ask for it.
Re: Гарантии безопасности исключений в GUI
От: c-smile Канада http://terrainformatica.com
Дата: 06.01.08 05:55
Оценка:
Здравствуйте, Termit, Вы писали:

T>Открыл для себя гарантии безопасности исключений и захотел их использовать в GUI приложении. Насколько я понял концепцию, надо, как минимум, гарантировать что все исключения должны быть перехвачены. Из UI вызывается 90% кода, соот-но надо наставить во всех UI callback-ах try/catch? Есть еще какие нибудь подходы? Глобальный обработчик не подходит потому что хочется продолжить выполнение программы.


Если для WTL то примерно так:

class CHTMLView : 
    public CWindowImpl<CHTMLView, CHTMLayoutCtrl>,
    public CHTMLayoutHost<CHTMLView>
    {
      BEGIN_MSG_MAP(CHTMLView)
        try 
        {
          MESSAGE_HANDLER(WM_CREATE, OnCreate)
          MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)
          MESSAGE_HANDLER(WM_RBUTTONUP, OnMouseUp)
        }
        catch(logic::error& e)
        {
          ...
        }
     END_MSG_MAP()
...


Но как-то это концептуально неправильно. Реально
все методы кроме WM_COMMAND не должны бросать исключения.
WM_COMMAND — это то место где управление уходит в логику и по всей видимости
там должно и обрабатываться.

Например ошибка открытия файла должна обрабатываться по месту.
Скажем в BlockNote при ошибке открытия файла загружается default (empty) document.
Обрабатывать сие в общем event handler — как-то неправильно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.