SimpleXML выдает обычное исключение, как я могу отличить это от других исключений, если класс такой же?
Проблема у вас очень локальная и может быть легко решена.
Вместо того, чтобы использовать
$xml = new SimpleXMLElement($buffer);
(исключение в том, что $buffer = ''
)
Вы можете использовать функцию, которая сообщает вам, работала ли загрузка буфера без выдачи исключения:
$xml = simplexml_load_string($buffer);
В случае ошибки, $xml
будет ложным Таким образом, у вас нет проблемы исключения в первую очередь.
Кроме того, я предлагаю вам сделать код более стабильным, если вы заинтересованы в более детальной обработке ошибок, такой как проверка предусловий и постусловий для вызова функции:
if (!is_string($buffer) || !strlen($buffer)) {
throw new UnexpectedValueException("String with length required");
}
$xml = simplexml_load_string($buffer);
if (!$xml) {
throw new UnexpectedValueException('String could not be parsed as XML');
}
Это также показывает, как вы можете генерировать исключения, которые вам нравятся. Однако, так как вас беспокоит только одна строка кода, вы можете просто поймать любой исключение и иметь дело с единственным случаем ошибки, который у вас есть:
try {
$xml = new SimpleXMLElement($buffer);
} catch (Exception $e) {
$xml = false;
}
Но потом, используя simplexml_load_string
может быть более удобным.
Кроме того, вы также можете включить внутреннюю отчетность об ошибках в libxml и узнать больше о реальных проблемах при создании объекта:
$saved = libxml_use_internal_errors(true);
$xml = simplexml_load_string($buffer);
$errors = libxml_get_errors();
libxml_use_internal_errors($saved);
if (!$xml) {
var_dump($errors); // create and throw a specific exception here based on errors.
}
Однако пустая строка не создаст никакой ошибки, лучше позаботьтесь о том, чтобы она была с проверкой предусловий.
Дополнительно:
Я сделал обходной путь, ловя и исследуя конкретное сообщение об ошибке.
try{
//...
}catch(Exception $e){
if(!strstr($e->getMessage(), 'XML')) throw $e;
}
Затем перебрасывание всего, что не связано с обработкой XML.