Поймать ошибку в Informix - PullRequest
       20

Поймать ошибку в Informix

1 голос
/ 29 июля 2011

Эта программа использует Informix 4GL. Цель состоит в том, чтобы удалить отчет. Ну, на самом деле это работает хорошо, но проблема в том, что только конкретный пользователь может удалить физический файл отчета, что означает администратор. Другой пользователь может удалить отчет в базе данных, но не физический путь. Поэтому мне нужно отловить ошибку в синтаксической команде rm -f. Я пытался использовать WHENEVER ERROR, но он не мог поймать его. кто нибудь знает как это сделать? Это код для удаления отчета:

 DELETE FROM sysrpt   
 WHERE srpt_seq_no   = p_sysrpt.srpt_seq_no        
 LET sel_rpt_id = ""    
 LET sel_rpt_id = p_sysrpt.srpt_pgm_id CLIPPED, ".", 
                  p_sysrpt.srpt_seq_no USING "<<<<<<"  
 LET sel_rpt_id = sel_rpt_id CLIPPED      
 LET prt_comand = "\\rm -f ", rpt_path CLIPPED, sel_rpt_id CLIPPED
 LET prt_comand = prt_comand CLIPPED                              
 RUN prt_comand                                                   

Ответы [ 3 ]

1 голос
/ 05 августа 2011

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

Возможно, файл отчета должен быть chmod послепоколение, чтобы позволить другим удалить его, или пользователи приложения должны иметь правильно установленный umask.

1 голос
/ 29 июля 2011

Я не думаю, что вы сможете получить полное сообщение об ошибке, если вы не перенаправите stdout / stderr в другой файл как часть команды rm.Вы можете получить код возврата из команды оболочки обратно в программу 4gl, используя предложение RETURNING инструкции RUN, например, вы можете добавить следующее после «RUN prt_command»:

RUN prt_comand RETURNING p_return_code

Из памятисчитаю, что вам нужно MOD 256 код возврата.

0 голосов
/ 04 августа 2011

Обратите внимание, что rm -f возвращает успех, даже если не удается удалить файл или файл не существует.Если вы хотите, чтобы rm возвратил ошибку, вы не должны указывать, чтобы она не возвращала ошибку.

В противном случае совет по использованию:

RUN prt_command RETURNING p_retcode

правильный.Если значение p_retcode не равно нулю, команда каким-то образом завершилась неудачей.


Скопированная ниже строка является излишней:

LET prt_comand = prt_comand CLIPPED

Если prt_command является CHARпеременной, то сохраненный результат снова заполняется пробелом (все переменные CHAR сохраняются с полными пробелами).Если prt_command является переменной VARCHR, предыдущее назначение с CLIPPED уже удалило завершающие пробелы.

Мне не ясно, почему вы используете обратную косую черту перед командой rm.Вы избегаете псевдонимов?Если так, время избавиться от псевдонима для rm;это смертельно в долгосрочной перспективе.Научитесь правильно использовать команду raw.Если вы когда-нибудь попадете на машину без псевдонима, вы не будете защищены, и вы будете злоупотреблять командой без какой-либо сети безопасности, которую псевдоним намеревается предоставить.

...