четверг, 19 июня 2014 г.

Про Exception'ы. Коротко. Скажем так - "анонс"

Можно написать так:

 try
  ...
 except
  on E: SomeException do
   ...
 end;

А можно вот так:

 try
  ...
 except
  on E: Exception do
   if E.ClassType = SomeException then
   ...
 end;

А можно вообще так:

 try
  ...
 except
  on E: Exception do
   if E.ClassName = 'SomeException' then
   ...
 end;

Что "правильнее" и что "лучше"?

Вопрос - НЕ ПРАЗДНЫЙ...

Особенно вариант с E.ClassType = SomeException...

Почему?

Потому что далеко не ВСЕГДА "разработчик библиотеки" может "угадать" какие исключения "пользователь" унаследует.

Особенно при наличии виртуальности.

Пояснения нужны?

P.S. Это скажем так - "провокационный пост".

2 комментария:

  1. Этот комментарий был удален автором.

    ОтветитьУдалить
  2. Первый вариант у нас - стандарт.
    Второй и третий варианты практически не используется, и я пока не вижу в них необходимости.
    Иногда оказывается востребованным такое:
    <code>
    try
      ...
    except
      on E: EAncestorException do
       if E is EInheritedException1 then
         ...
       else if E is EInheritedException2 then
         ...
       else
         ...
    end;
    </code>
    Но это - не второй вариант, поскольку is это не сравнение на равенство.

    «далеко не ВСЕГДА "разработчик библиотеки" может "угадать" какие исключения "пользователь" унаследует.»
    -- IMHO разработчик библиотеки ничего угадывать не должен.
    Если пользователь унаследовал исключение от определённого в библиотеке - значит, он сознательно отнёс его к классу исключений библиотеки. Со всеми вытекающими отсюда последствиями. В частности, это исключение будет обработано наряду с родительским, если такая обработка предусмотрена.

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

    ОтветитьУдалить