代码之家  ›  专栏  ›  技术社区  ›  Notaras

为什么PHP无法捕获在尝试实例化SoapClient对象时引起的异常?

  •  0
  • Notaras  · 技术社区  · 6 年前

    如果您没有php\U soap。php中已启用dll扩展。ini文件,正在尝试创建的实例 SoapClient 将导致PHP中断。

    如果我用这样的试抓块围住装置,

    try{
           $client = new SoapClient ($wsdl, array('cache_wsdl' => WSDL_CACHE_NONE) );   
           $result = $client->{$web_service}($parameters)->{$web_service."Result"};
           return $result;
       }
       catch(Exception $e){
            echo $e->getMessage();
       }
    

    它抓不住过度。相反,它就像 die() 已在内部PHP代码中的某个地方调用。有人知道为什么会这样吗?

    注意:im使用PHP 7.2.1版

    2 回复  |  直到 6 年前
        1
  •  2
  •   user2575725 user2575725    6 年前

    问题是PHP异常处理程序块,即。 try-catch 无法处理由引发的错误 trigger_error()

    使用PHP set_error_handler() 相反

        2
  •  1
  •   simirimia    6 年前

    正如Arvind已经指出的,错误和异常在PHP中是两件不同的事情。try/catch只能在异常情况下工作,不能在错误情况下工作。

    这里再解释一下您可以做什么:

    错误处理或多或少是为应用程序全局定义的。内置的错误处理检查错误的严重性,并据此记录错误并停止执行。

    您可以通过使用set\u error\u handler()设置自定义错误处理程序来覆盖此行为( http://php.net/set_error_handler )。

    非常常见的方法是定义引发异常的自定义错误处理程序。然后,您就可以在代码中使用try/catch来处理错误和异常。此处编写了一个执行此操作的示例错误处理程序: http://php.net/manual/en/class.errorexception.php

    从那里复制了最有趣的部分:

    function exception_error_handler($severity, $message, $file, $line) {
        if (!(error_reporting() & $severity)) {
            // This error code is not included in error_reporting
            return;
        }
        throw new ErrorException($message, 0, $severity, $file, $line);
    }
    set_error_handler("exception_error_handler");
    

    如果您将此代码放在靠近应用程序开头的位置,而不是引发错误,则会引发ErrorException。这应该适用于SoapClient错误。