Как наиболее рационально перехватить ошибку при подключении файлов?

Добрый вечер!
Вкратце ситуация такова. Есть некоторые библиотеки, наподобие GeoIp, которые подключаются в проект динамически на определенных страницах. Может быть ситуация, когда библиотеки нет. Стандартно тогда пользователю вываливается куча непонятного ему текста. Я же хочу перехватить исключение, обработать его и вывести пользователю красивое уведомление.

Вариант с file_exists отмел сразу, т.к. он медленный и нерациональный (два раза запрашиваем файл вместо одного). И нашел такой:
try {
	if(! @include_once(LIBS_PATH . "geoip.inc")) {
		throw new Exception("Error: geoip.inc not found", 1);
	}
} catch (Exception $e) {
	$this->view->setError($e->getMessage());
}

Использование собаки в коде - безусловно, плохой стиль. Однако в данном случае как поступить? Жертвовать производительностью, используя file_exists, забыть про include и читать файл вручную при помощи fopen \ fread, или же использование собаки в подобных случаях (когда системная ошибка перехватывается программистом) вполне юзабельно?..

Буду благодарен за советы, спасибо.
  • Вопрос задан
  • 135 просмотров
Решения вопроса 2
DevMan
@DevMan
try {
	if(! is_file("not-existing-file")) {
		throw new Exception("Error: not-existing-file not found", 1);
	}
} catch (Exception $e) {
	echo $e->getMessage();
}
Ответ написан
Комментировать
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
Вы замеры проводили, насколько file_exists медленный? Преждевременная оптимизация - корень всех зол.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@matperez
А еще, в дополнение к тому, что написал Алексей Уколов, если имеется в виду https://github.com/maxmind/geoip-api-php, то правильнее будет цеплять ее через Composer и вообще не думать о включении файлов.
Ответ написан
Комментировать
@japanxt
Установить обработчик ошибок php.net/manual/ru/function.set-exception-handler.php , который будет вызывать эксепшен, эксепшен уже можно будет перехватывать.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы