March 20, 2011

Отслеживание ошибок и уведомлений PHP

Иногда бывает необходимо отследить некритические ошибки, возникающие в работе РНР скрипта (E_WARNING, E_NOTICE, etc.) и куда-то их грамотно собрать.

К примеру, мы хотим сделать валидацию XML файла с помощью XMLReader (кстати, об этом, думаю, можно рассказать в отдельной публикации). В случае, если XML невалидный, то выбросить исключение, прекратив дальнейшую работу.

Все ошибки валидации выдаются через WARNING-сообщения.

Для того, чтобы получить такое сообщение можно поступить следующим образом:

// Track the errors (to be able to store the PHP error message)
$oldConfigValue = ini_set('track_errors', '1');
while ($xmlReader->read()) {} // полностью читаем XML
if (!$xmlReader->isValid())
{
  throw new Exception('XML does not conform to schema. ' . $php_errormsg);
}
// Set back track_errors setting:
ini_set('track_errors', $oldConfigValue);

Здесь мы сначала устанавливаем директиву РНР 'track_errors' (Отслеживать ошибки) в TRUE (1). А далее — magic! 🙂

Есть, оказывается, такая чудесная встроенная переменная $php_errormsg, которая и содержит в себе сообщения об ошибках (warnign, notice, и пр.)

Когда данная штуковина нам уже не нужна, мы можем вернуть прежнюю директиву на место, т.к. сохранили её предыдущее значение в переменной $oldConfigValue

Т.о. мы имеем осмысленное сообщение о том, почему же наш XML не прошел валидацию по нашей же схеме.