Иногда бывает необходимо отследить некритические ошибки, возникающие в работе РНР скрипта (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 не прошел валидацию по нашей же схеме.