Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

CGI-программирование с самого начала. обработка ошибок при работе с файлами #2


Уважаемые подписчики!

В прошлом выпуске рассылки мы начали рассматривать обработку ошибок при работе с файлами и рассмотрели простейший и классический вариант обработки этих ошибок - генерацию фатальной ошибки и аварийное прерывание работы скрипта. Это самый классический способ, описанный в документации и учебиках по Perl.

Однако, на практике, все ли могут им воспользоваться?

Дело в том, что у пользователя хостинга может отсутствовать доступ к журналу ошибок (error log) сайта (в основном это относится к бесплатным хостингам), что сделает невозможным "штатное" получение информации об ошибке. В этом случае неплохо было бы сделать так, чтобы информация об ошибке записывалась не только и не столько в журнале ошибок веб-сервера, сколько в некий файл - собственный журнал ошибок. Это можно сделать по-разному - скажем, перед вызовом функции die открывать для добавления вышеуказанный файл и записывать в него нужную информацию.

А можно поступить несколько сложнее, но более изящно и универсально: организовать в своем скрипте собственный обработчик фатальных ошибок. Этот красивый способ имеет неоспоримые преимущества перед другими, а именно:

  1. Для генерации фатальной ошибки в скрипте используется все та же стандартная функция die - меняется только ее "обработка";
  2. Из п.1 следует, что созданный нами обработчик мы можем применять для отладки не только своих собственных скриптов, но также любых других, использующих функцию die. Для этого достаточно лишь добавить код нашего обработчика в любой скрипт, не особо вдаваясь в код самого скрипта, и мы сможем получить его сообщения об ошибках в доступном нам файле;
  3. Таким образом можно "отловить" не только ошибки при работе с файлами, а и другие фатальные ошибки, возникающие во время выполнения скрипта.

Интерпретатор языка Perl является достаточно "гибким" и позволяет программисту включить в скрипт свой собственный код обработки фатальной ошибки. Делается это с помощью переопределения стандартного сигнала "__DIE__". Этот код будет исполняться при каждой фатальной ошибке и записывать в наш файл информацию о возникшей ошибке.

Итак, для того, чтобы некоторая функция стала обработчиком фатальной ошибки, необходимо прописать ее имя как обработчик сигнала "__DIE__" в специальном хэше %SIG. Пусть наша функция называется LogErrors, тогда в начале скрипта определим следующее:


$SIG{'__DIE__'}="LogErrors";

С этого момента функция LogErrors становится обработчиком фатальных ошибок в скрипте.

Теперь займемся самой функцией. Она должна открывать наш файл журнала для дозаписи в его конец (пусть он называется err.txt), записывать в него информацию об ошибке и закрывать файл. Обработчику ошибки информация о ней передается в $_[0] (первом элементе массива аргументов функции). Это - то же сообщение, которое будет записано в "штатный" журнал ошибок веб-сервера. Итак, наш обработчик может выглядеть следующим образом:


sub LogErrors
 {
 open ER,">>err.txt";
 print ER $_[0];
 close ER;
 }

Теперь все фатальные ошибки, произошедшие во время выполнения скрипта, включая, естественно, и ошибки, сгенерированные функцией die, будут "дублироваться" в наш собственный файл-журнал err.txt.

Отмечу, что речь идет именно об ошибках во время выполнения скрипта, но не ошибках его компиляции перед выполнением - ведь для того, чтобы "включился" наш обработчик ошибок, надо, по крайней мере, чтобы скрипт начал исполняться, и была отработана операция


$SIG{'__DIE__'}="LogErrors";

Поэтому данный метод не подходит, скажем, для "отлавливания" синтаксических ошибок в скрипте, т.к. интерпретатор Perl "спотыкается" на них еще на этапе компиляции. С другой стороны, синтаксические и другие ошибки в любом случае значительно проще "отловить" на этапе локальной отладки скрипта (на своем компьютере), чем на этапе отладки на сервере. А на этапе отладки на сервере нужна именно возможность определять ошибки при выполнении, в частности - ошибки при работе с файлами :-)


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

Также напоминаем Вам, что на сайте нашей рассылки http://www.cgi-scripts.info/ Вы сможете найти статьи по CGI-программированию, а также наши готовые скрипты и программы на Perl, которые Вы можете использовать на своих сайтах. А на другом нашем сайте http://www.angel07.webservis.ru/ Вы можете найти различные материалы о хостинге.

До следующих встреч!


Успехов!
Андрей
angel07@inbox.ru

В избранное