Грубо говоря, ошибки являются наследием в PHP, а исключения - это современный способ обработки ошибок. Самое простое - установить обработчик ошибок, который выдает исключение. Таким образом, все ошибки преобразуются в исключения, и тогда вы можете просто иметь дело с одной схемой обработки ошибок. Следующий код преобразует ошибки в исключения для вас:
function exceptions_error_handler($severity, $message, $filename, $lineno) {
if (error_reporting() == 0) {
return;
}
if (error_reporting() & $severity) {
throw new ErrorException($message, 0, $severity, $filename, $lineno);
}
}
set_error_handler('exceptions_error_handler');
error_reporting(E_ALL ^ E_STRICT);
Есть несколько случаев, когда код специально разработан для работы с ошибками. Например, метод schemaValidate
для DomDocument
вызывает предупреждения при проверке документа. Если вы преобразуете ошибки в исключения, проверка прекратится после первого сбоя. Иногда это то, что вам нужно, но при проверке документа вы можете захотеть всех сбоев. В этом случае вы можете временно установить обработчик ошибок, который собирает ошибки. Вот небольшой фрагмент, который я использовал для этой цели:
class errorhandler_LoggingCaller {
protected $errors = array();
function call($callback, $arguments = array()) {
set_error_handler(array($this, "onError"));
$orig_error_reporting = error_reporting(E_ALL);
try {
$result = call_user_func_array($callback, $arguments);
} catch (Exception $ex) {
restore_error_handler();
error_reporting($orig_error_reporting);
throw $ex;
}
restore_error_handler();
error_reporting($orig_error_reporting);
return $result;
}
function onError($severity, $message, $file = null, $line = null) {
$this->errors[] = $message;
}
function getErrors() {
return $this->errors;
}
function hasErrors() {
return count($this->errors) > 0;
}
}
И вариант использования:
$doc = new DomDocument();
$doc->load($xml_filename);
$validation = new errorhandler_LoggingCaller();
$validation->call(
array($doc, 'schemaValidate'),
array($xsd_filename));
if ($validation->hasErrors()) {
var_dump($validation->getErrors());
}