仅捕获SimpleXML异常?

Ráp*_*rás 2 php exception-handling exception simplexml

SimpleXML会引发常规Exception,如果类相同,如何将其与其他异常区分开?

hak*_*kre 5

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

而不是使用

$xml = new SimpleXMLElement($buffer);
Run Code Online (Sandbox Code Playgroud)

(例外情况是$buffer = ''

您可以使用一个函数,该函数告诉您是否在不引发异常的情况下加载缓冲区?

$xml = simplexml_load_string($buffer);
Run Code Online (Sandbox Code Playgroud)

如果有错误,$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');
}
Run Code Online (Sandbox Code Playgroud)

这也说明了如何抛出自己喜欢的异常。但是,由于您只关心一行代码,因此您可以捕获任何异常并处理那里的单个错误情况:

try {
    $xml = new SimpleXMLElement($buffer);
} catch (Exception $e) {
    $xml = false;
}
Run Code Online (Sandbox Code Playgroud)

但是,使用起来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.
}
Run Code Online (Sandbox Code Playgroud)

但是,空字符串不会产生任何错误,如果进行前提条件检查,则应格外小心。

另外:

  • 在下载时,将cron-job保存为其他文件名,仅在准备好后才替换该文件。
  • 以只读方式打开文件。