Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > Как перехватить системную ошибку


Автор: korob2001 19.3.2004, 04:23
Всем, привет!
Ради тренировки, написал программу в которой дескрипторы STDIN, STDOUT и STDERR связываю с файлами, как показано ниже:

STDIN - 'infile.txt'
STDOUT - 'outfile.txt'
STDERR - 'errfile.txt'

В файле infile.txt прописаны команды Командной строки. После выполнения программы, в файл outfile.txt записываются результаты команд прописаных в файле infile.txt, а в файл errfile.txt ошибки, которые возникли при выполнении системных комад и самой программы.

Так как, в файл outfile.txt символы кирилицы записывались досовской кодировке, я решил написать небольшой класс, цель методов которого, перекодировать символы полученной строки из одной кодировки в другую и вернуть уже перекодированную строку. Но для того что бы он мог перекодировать, одному из его методов необходимо передать строку а результат сохранить в переменную. С файлом outfile.txt проблем не возникло, зато в файл errfile.txt все записи, где есть символы кирилицы, прописываются в дос-кодировке. sad.gif

Как перехватить системную ошибку и сохранить её в переменной, для дальнейшей обработки и затем вывести эту, уже обработанную, ошибку в STDERR?

Заранее спасибо,
Денис

Автор: Arush 29.3.2004, 20:06
Ты наверно имеешь в виду не "перехватить системную ошибку" а "перхватить текст сообщения об ошибке" ?
IMHO проще всего открыть какой-нибудь пайп, дескриптор для записи назначить как stderr, из дескриптора для чтения читать, перекодировать в нужную кодировку и записывать на диск(причем для пайпа это наверно можно будет сделать один раз - в конце программы).

Удачи

Александр

Автор: korob2001 30.3.2004, 18:43
To Arush
Насколько я понимаю в конце программы нужно сделать что-то подобное:
Код

open(INERR, "< errfile.txt") or die $!;
 open(OUTERR, "> errfile.txt.back" ) or die $!;
    while ( <INERR> ) {
       chomp;
       # обрабатываем строки
       print OUTERR $_, "\n";
    }
 close(OUTERR) or die $!;
close(INERR) or die $!;
unlink 'errfile.txt' or die $!;
rename('errfile.txt.back', 'errfile.txt') or die $!;

Автор: Гость_mcx 26.6.2004, 19:03
можно использовать модуль CGI

Код

use CGI::Carp qw(set_message);
   BEGIN {
      sub handle_errors {
         my $msg = shift;
        #здесь деалешь что тебе нужно с строкой $msg
         exit;
     }
     set_message(\&handle_errors);
   }

Автор: korob2001 27.6.2004, 02:50
Большое спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)