只捕获SimpleXML Exception?

时间:2014-12-07 17:45:35

标签: php exception exception-handling simplexml

SimpleXML抛出一个常规异常,如果该类是相同的,我如何区别于其他异常?

2 个答案:

答案 0 :(得分:5)

您遇到的问题非常局部,可以轻松处理。

而不是使用

$xml = new SimpleXMLElement($buffer);

(例外情况是$buffer = ''

您可以使用一个函数来告诉您缓冲区的加载是否有效,而不会抛出异常:

$xml = simplexml_load_string($buffer);

如果出现错误,$xml将为false。所以你首先没有异常问题。

此外,如果您对更详细的错误处理感兴趣,例如检查函数调用的前置条件和后置条件,我建议您使代码更稳定:

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-job保存为不同的文件名,仅在准备好时替换文件。
  • 以只读方式打开文件。

答案 1 :(得分:3)

我做了一个解决方法,捕获并调查了特定的错误消息。

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

然后重新抛出与XML处理无关的所有内容。