Можно написать так:
А можно вот так:
А можно вообще так:
Что "правильнее" и что "лучше"?
Вопрос - НЕ ПРАЗДНЫЙ...
Особенно вариант с E.ClassType = SomeException...
Почему?
Потому что далеко не ВСЕГДА "разработчик библиотеки" может "угадать" какие исключения "пользователь" унаследует.
Особенно при наличии виртуальности.
Пояснения нужны?
P.S. Это скажем так - "провокационный пост".
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. Это скажем так - "провокационный пост".
Этот комментарий был удален автором.
ОтветитьУдалитьПервый вариант у нас - стандарт.
ОтветитьУдалитьВторой и третий варианты практически не используется, и я пока не вижу в них необходимости.
Иногда оказывается востребованным такое:
<code>
try
...
except
on E: EAncestorException do
if E is EInheritedException1 then
...
else if E is EInheritedException2 then
...
else
...
end;
</code>
Но это - не второй вариант, поскольку is это не сравнение на равенство.
«далеко не ВСЕГДА "разработчик библиотеки" может "угадать" какие исключения "пользователь" унаследует.»
-- IMHO разработчик библиотеки ничего угадывать не должен.
Если пользователь унаследовал исключение от определённого в библиотеке - значит, он сознательно отнёс его к классу исключений библиотеки. Со всеми вытекающими отсюда последствиями. В частности, это исключение будет обработано наряду с родительским, если такая обработка предусмотрена.
Резюме: при прочих равных всегда использовать первый вариант и рассчитывать, что обработка исключений будет производиться именно по сценарию первого варианта.