仅捕获简单 XML 异常


Catch SimpleXML Exception only?

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

但是,空字符串不会产生任何错误,最好小心,如果它带有前提条件检查。

此外:

  • 在加载时将 cron-job 保存到不同的文件名,仅在准备就绪时替换文件。
  • 以只读方式打开文件。

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

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

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