Можно ли перехватить сообщение об ошибке, выдаваемое при вызове программы в программе RPG?

Я пытаюсь заставить RPG-программу сообщать более конкретные детали, когда вызов программы внутри нее идет не так, как надо. Исключение, которое я хочу отслеживать, не имеет ничего общего с плохой логикой программы, скажем, с делением на ноль. Я хочу проверить, произошел ли сбой вызова программы из-за проблемы с полномочиями или из-за того, что программа не найдена. Индикатор на 73-74 может только сказать, что есть исключение, а не его причина. Есть ли какие-либо возможные средства для обнаружения этого в RPG, как оператор MONMSG в программе CL?


person God_of_Thunder    schedule 31.10.2012    source источник


Ответы (2)


Существует два класса ошибок: Program и File. Ошибки программы — это такие вещи, как деление на ноль, ошибка CALL и т. д. Полный список находится по адресу Коды состояния программы. Эти коды ошибок очень грубые — если вы ЗВОНИТЕ PGMX и возникает проблема с правами доступа, вы получаете 00211. Если программы нет в списке библиотек, вы получаете 00211. Если программа завершается ненормально (скажем, из-за управляющего сообщения ) вы получите 00211. Если вам нужно узнать, почему CALL не удалось, вам нужно запросить журнал заданий / очередь программных сообщений.

Для файловых ошибок информация о файле структура запишет код ошибки. Ошибки файлов — это такие вещи, как нарушение реляционных ограничений или постоянная ошибка ввода-вывода. Опять же, эти коды состояния файла не очень детализированы, и если вам нужно знать, что у вас произошел сбой полномочий, вам нужно будет узнать это из журнала заданий.

Одно замечание об ошибках файлов. При написании собственного обработчика ошибок (ошибка исключения файла подпрограмма), вы должны знать, что этот обработчик не становится активным до тех пор, пока ПОСЛЕ того, как цикл не откроет файлы. Это означает, что если вы позволите циклу открывать файлы, вы не сможете отловить такие ошибки, как «файл отсутствует в списке библиотек» или «не авторизован для доступа к файлу». Чтобы отловить ошибки, возникающие при открытии, вам нужно открыть файлы самостоятельно, через опкод OPEN. Не забудьте их ЗАКРЫТЬ.

person Buck Calabro    schedule 31.10.2012
comment
Я просто хочу, чтобы причина верхнего уровня была найдена. Думает, что деление на ноль или ошибку уровня можно рассматривать как один тип. Вопрос авторитета - другой. Программа не найдена — третий тип. - person God_of_Thunder; 01.11.2012
comment
Вы, безусловно, можете сгруппировать ошибки любым удобным для вас способом, чтобы ваше приложение имело смысл. Я указываю на то, что обнаружение их займет два отдельных логических процесса. Один для ошибок программы и другой для ошибок файла. В коде старого стиля это включало бы создание *PSSR для ошибок программы и INFSR для ошибок файла. Если вы достаточно хорошо разбираетесь в обработке ошибок, вы можете сделать их одним и тем же SUBR. Более новый код будет использовать расширитель кода операции (e) и %status, а самый новый код будет использовать блоки MONITOR. - person Buck Calabro; 01.11.2012
comment
Можно ли использовать позиции PSDS 40~46 в вызывающей программе, чтобы указать причину неудачного вызова программы? - person God_of_Thunder; 03.11.2012
comment
Да, это возможно. Но это полностью зависит от того, как завершится вызванная программа. Если он заканчивается на CEE9901, вы найдете это достаточно полезным, или вам нужно будет вернуться назад, чтобы найти диагностическое сообщение MCH3601, которое говорит вам, что вы не передали достаточно параметров? - person Buck Calabro; 05.11.2012
comment
Тогда есть ли общее сообщение, охватывающее все случаи? Я имею в виду, если мне просто нужно знать, что вызванная программа завершилась ненормально, какое сообщение я должен проверить? И есть ли способ предотвратить появление сообщения о прерывании, когда вызываемая программа идет не так? Я хочу, чтобы за этим следили, я не хочу, чтобы это красовалось на экране и мешало процессу. - person God_of_Thunder; 05.11.2012
comment
Если вас волнует только то, что CALL не удался, поместите индикатор в столбцы ошибок или используйте CALL(E). Чтобы остановить сообщение о прерывании в вызываемой программе, вам необходимо отслеживать сообщения там. - person Buck Calabro; 05.11.2012
comment
Индикатор ошибки для CALL слишком общий. Я бы не стал задавать этот вопрос, если бы его было достаточно. - person God_of_Thunder; 05.11.2012
comment
Темы дрейфуют по мере того, как предлагаются идеи. Вы просили одно общее сообщение, чтобы охватить все случаи. Это именно то, что делает индикатор ошибок. CALL(E) с %STATUS (как предложено выше) будет немного более детализированным. Вам нужно будет решить, какая степень записи ошибок лучше всего подходит для вашей ситуации. - person Buck Calabro; 05.11.2012

Используйте операции обработки ошибок и/или подпрограмма исключения программы и структура данных состояния программы для обнаружения и интерпретации определенных ошибок.

person James Allman    schedule 31.10.2012
comment
Работает ли операция обработки ошибок в фиксированном формате? Я предполагаю, что эта вызываемая программа всегда будет работать в нормальном состоянии, кроме случаев, когда нет прав доступа к ней или она не найдена в списке библиотек. Такие вещи, как десятичная ошибка, здесь не беспокоят. - person God_of_Thunder; 31.10.2012
comment
@God_of_Thunder Существуют версии обработки ошибок в фиксированном и свободном формате. - person James Allman; 31.10.2012
comment
Если я ожидаю таких вещей, как несанкционированная программа или программа не найдена, какой код ошибки мне следует использовать? 211? - person God_of_Thunder; 31.10.2012
comment
@God_of_Thunder Вам нужно проверить, чтобы быть уверенным. Вы также можете получить номер сообщения CPF/MCH из PSDS в позициях 43..46 для более подробной информации. - person James Allman; 31.10.2012