【问题标题】:PHP DOMDocument error handlingPHP DOMDocument 错误处理
【发布时间】:2023-03-04 09:53:01
【问题描述】:

在我的应用程序中,我从 url 加载 xml 以解析它。 但有时这个网址可能无效。在这种情况下,我需要处理错误。 我有以下代码:

$xdoc = new DOMDocument();
try{
  $xdoc->load($url); // This line causes Warning: DOMDocument::load(...)
                     // [domdocument.load]: failed to open stream: 
                     // HTTP request failed! HTTP/1.1 404 Not Found in ...
} catch (Exception $e) {
  $xdoc = null;
}

if($xdoc == null){
  // Handle
} else {
  // Proceed
}

我知道我可能做错了,但是处理这种异常的正确方法是什么?我不想在我的页面上看到错误消息。

DOMDocument::load() 的手册说:

如果一个空字符串作为 文件名或一个空文件被命名,一个 会产生警告。这 libxml 不会生成警告,并且 无法使用 libxml 的错误处理 处理函数。

但是没有关于如何处理的信息。

谢谢。

【问题讨论】:

    标签: php xml exception dom error-handling


    【解决方案1】:

    对我来说,跟着做就行了

    $feed = new DOMDocument();  
    $res= @$feed->load('http://www.astrology.com/horoscopes/daily-extended.rss');
    if($res==1){
               //do sth
              }
    

    【讨论】:

      【解决方案2】:

      禁用抛出错误:

      $internal_errors = libxml_use_internal_errors(true);
      
      $dom = new DOMDocument();
      // etc...
      
      libxml_use_internal_errors($internal_errors);
      

      【讨论】:

      • 阅读手册。此警告不是 libxml 生成的,无法使用 libxml 的错误处理函数进行处理。
      • libxml_get_last_error() 一起使用时完美运行。
      【解决方案3】:
      set_error_handler(function($number, $error){
          if (preg_match('/^DOMDocument::loadXML\(\): (.+)$/', $error, $m) === 1) {
              throw new Exception($m[1]);
          }
      });
      
      $xml = new DOMDocument();
      $xml->loadXML($xmlData);
      
      restore_error_handler();
      

      这在 PHP 5.3 中对我有用。但是如果你没有使用loadXML,你可能需要做一些修改。

      【讨论】:

      • 我正在使用 loadXML,但仍然没有帮助... :(
      • @Znarkus 我相信当前的解决方案包含一个小错误。为了使此代码没有副作用,必须将自定义错误处理程序从堆栈中弹出无论 loadXML() 是否完成且没有错误。目前,如果loadXML() 发出被自定义错误处理程序拦截的错误,则永远不会调用restore_error_handler();。自定义错误处理程序将保持有效——我们几乎肯定不希望这样做。为了解决这个问题,我建议在抛出异常之前在闭包的 if 语句中添加对 restore_error_handler(); 的调用。
      【解决方案4】:

      来自 php.net

      如果一个空字符串作为 文件名或一个空文件被命名,一个 会产生警告。这 libxml 不会生成警告,并且 无法使用 libxml 的错误处理 处理函数。

      在您的生产环境中,您不应该向用户显示错误。他们不需要看到它们,因此考虑到这一点,您可以使用...

      $xdoc = new DOMDocument();
      if ( $xdoc->load($url) ) {
          // valid
      }
      else {
          // invalid
      }
      

      【讨论】:

      • 因为load 有时会发出警告,所以这个解决方案只有在完全禁用错误报告的情况下才有效,这是一种不好的做法。如果您只是对用户隐藏错误,那么您最终不会出现在 // invalid 块中,因此不会按预期处理错误。正确的做法是使用set_error_handler
      【解决方案5】:

      根据我从documentation 收集到的信息,处理此方法发出的警告很棘手,因为它们不是由libxml 扩展生成的,因此无法由libxml_get_last_error() 处理。您可以使用错误抑制运算符并检查 false 的返回值...

      if (@$xdoc->load($url) === false)
          // ...handle it
      

      ...或注册an error handler which throws an exception on error:

      function exception_error_handler($errno, $errstr, $errfile, $errline ) {
          throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
      }
      

      然后抓住它。

      【讨论】:

      • 也可以使用 libxml_use_internal_errors(false) 来抑制错误并检查数据是否有错误
      • 这非常适合检查是否没有互联网连接:if (@$xdoc->load($url) === false)
      猜你喜欢
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多