Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是否仅捕获SimpleXML异常?_Php_Exception_Exception Handling_Simplexml - Fatal编程技术网

Php 是否仅捕获SimpleXML异常?

Php 是否仅捕获SimpleXML异常?,php,exception,exception-handling,simplexml,Php,Exception,Exception Handling,Simplexml,SimpleXML抛出一个常规异常,如果类相同,我如何将其与其他异常区分开来?我做了一个变通方法,捕获并调查特定的错误消息 try{ //... }catch(Exception $e){ if(!strstr($e->getMessage(), 'XML')) throw $e; } 然后重新引用与XML处理无关的所有内容。您遇到的问题是非常局部的,可以轻松处理 而不是使用 $xml = new SimpleXMLElement($buffer); (例外情况是$bu

SimpleXML抛出一个常规异常,如果类相同,我如何将其与其他异常区分开来?

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

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

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

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

而不是使用

$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\u load\u 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作业保存为其他文件名,仅在准备就绪时替换该文件
  • 以只读方式打开文件

SimpleXML中的哪个方法引发异常?您可以扩展SimpleXML,捕获此异常,然后重新引用自己的异常。我希望避免重新引用。我在做这件事的时候,不知从哪里看到了很多ReflectionException,它们应该属于其他异常类。顺便说一句,构造函数给出了要解析的XML无效的异常。实际上,当两个进程试图同时访问同一个XML文件时,这是一个很少发生的时间问题,因此其中一个file_get_contents函数返回一个空字符串(文件被锁定),这当然是无效的XML。我想处理这些异常。你能阻止这两个进程为文件争吵吗?您能否锁定文件以进行读写操作以防止出现这种情况?这听起来像是需要修复的根本原因,而不是处理它造成的混乱。我不知道为什么会引发ReflectionException,但重新引发异常是很正常的,所以听起来像是需要修复的事情。@halfer这是一个更复杂的问题。我使用一个外部API进行股票分析,我必须每5秒查询一次。如果由于某种原因执行时间超过5秒,则它们在时间上重叠。这是数据库查询优化和算法重构的问题。目前我无法真正避免根本原因,我只是不想让它一直对所有日志进行垃圾邮件处理。非常感谢您提供的详细答案,我认为这并不是那么容易:)