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 处理无关的所有内容。