Сергей Прохоренко писал(а):
Драконограф писал(а):
Вот такой вопрос возникает...
Делать ли такую ситуацию исключением - решает программист.
Если он решит сделать ее исключением, то процедура
Б, вызвавшая исключение, будет принудительно завершена без возврата каких-либо значений параметров. Что делать в этом случае - опять же решает программист, который пишет обработчик в вызывающей процедуре
А.
Если программист хочет, чтобы нештатно завершившаяся процедура
Б вернула какие-то значения, то он не сможет воспользоваться механизмом исключений. Чтобы всё же использовать механизм исключений, ему придется разбить свою процедуру
Б на две. Нештатная процедура
Б2 вызовет исключение и бесследно завершится, а другая процедура
Б1 обработает исключение и вернет какие-то параметры в вызывающую процедуру
А.
Фактически предлагаемая вами система --- система обработки кодов возврата ошибки, но вы её зачем-то стараетесь усложнить и обособить.
У меня есть серьёзные сомнения по поводу её необходимости и эффективности.
Во-первых, часто просо кода ошибки (названия исключения) не достаточно, а требуется ещё некоторая дополнительная информация. В случае необходимости "ручной" обработки программисту придётся эту дополнительную информацию передавать и обрабатывать, а что делать с "автоматической"? Когда данные о процедуре, вызвавший исключение теряются.
Во-вторых, пример:
Код:
PROCEDURE Proc1 ();
BEGIN
throw MyFavoriteException;
END Proc1;
call Proc1 ();
catch (MyFirstException)
...
catch (MySecondException)
...
endcall
Т.е. что будет происходить, когда в вызывающей процедуре не предусмотрена обработка вызванного исключения?
Сейчас поясню для чего я спрашиваю.
Хотите обеспечить удобства программистам?
Вот в Java есть
IOException у него есть потомки
FileException ,
StreamException, и я могу обрабатывать только исключения IOException, при этом будут обработаны все исключения, которые являются его наследниками, если для них не предусмотренно специальных обработчиков. Это позволяет создавать независимые компоненты, которые не требуется перекомпилировать при изменении других компонент.
Предположим, что в моём примере Proc1 расположена в одном модуле (mod1), а вызывающая процедура в другом (mod2). В таком случае изменения модуля (mod1) будут требовать обязательной перекомпиляции модуля (mod2).