SimpleXML抛出一个常规异常,如果该类是相同的,我如何区别于其他异常?
答案 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.
}
但是,空字符串不会产生任何错误,如果使用前置条件检查则更好。
此外:
答案 1 :(得分:3)
我做了一个解决方法,捕获并调查了特定的错误消息。
try{
//...
}catch(Exception $e){
if(!strstr($e->getMessage(), 'XML')) throw $e;
}
然后重新抛出与XML处理无关的所有内容。