Поймать только исключение SimpleXML?

SimpleXML выдает обычное исключение, как я могу отличить это от других исключений, если класс такой же?

2

Решение

Проблема у вас очень локальная и может быть легко решена.

Вместо того, чтобы использовать

$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.
}

Однако пустая строка не создаст никакой ошибки, лучше позаботьтесь о том, чтобы она была с проверкой предусловий.

Дополнительно:

  • При загрузке сохраните задание cron под другим именем, заменив файл только тогда, когда будете готовы.
  • Откройте файл только для чтения.
4

Другие решения

Я сделал обходной путь, ловя и исследуя конкретное сообщение об ошибке.

try{
//...
}catch(Exception $e){
if(!strstr($e->getMessage(), 'XML')) throw $e;
}

Затем перебрасывание всего, что не связано с обработкой XML.

3

По вопросам рекламы [email protected]