如何找出PHP代码块可能抛出的所有错误?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何找出PHP代码块可能抛出的所有错误?相关的知识,希望对你有一定的参考价值。

对于动态代码,我想知道可以抛出哪些错误,而不是静态代码。例如,我的代码可以在不抛出任何Exceptions 10年的情况下运行,然后抛出UncaughtException

我想特别(非一般地)捕获我可以使用的方法抛出的每种类型的异常。我怎么知道这些方法可能抛出什么异常?

我想非常一般地捕获可能为一段php代码抛出的每种类型的错误。

可能抛出的异常示例:

PDOException
ExpiredException

现在我围绕着一切:

try{
 ...
}catch(Exception $e){
 ...
}

我想用这样的东西替换它:

try{
 ...
}catch(PDOException $e){
 ...
}catch(ExpiredException $e){
 ...
}catch(Exception $e){
 ...
}

我想确信我正在捕获可以通过代码部分中的方法抛出的所有不同类型的异常

如果我单独捕获所有异常,删除此部分是否安全?:

catch(Exception $e){
 ... 
}

或者是否有方法会简单地抛出异常?

我的解决方案首选项列表(1是最受欢迎的解决方案):

1:我可以打开一个标志,这将导致php.exe警告我每个可能的异常类型的异常被捕获

2:一种单独检查每种方法并查看可以抛出哪些错误的方法。文档是检查的唯一方法吗?或者是否有一些IDE或PHP块会告诉我个别方法可能抛出哪些异常?

答案

您可以使用register_shutdown_function()设置回调函数,它将调用您的PHP代码执行的每一端。在此回调函数中,您可以使用error_get_last()检查是否发生任何错误。例如:

// Register shutdown function
register_shutdown_function("shutdownTracker");

// Define all error types you want to catch and handle
define('E_FATAL', E_ERROR | E_PARSE | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR);

function shutdownTracker() {
    $error = error_get_last(); // This will return empty if no error occurs while executing php code.
    if(!empty($error) && ($error['type'] & E_FATAL)) {
        // Write your code here to handle you error

    }
}

注意:您应该在代码之上包含此代码。

另一答案

好吧,如果你在谈论例外,你已经有了答案

try{
 ...
}catch(PDOException $e){
 ...
}catch(ExpiredException $e){
 ...
}catch(Exception $e){
   echo get_class($e); // get's the class of unrecorded exceptions.
   //catches any exceptions missed by the above
}

现在,如果你在谈论“错误”,你可以做的是使用custom error handler

  if(!function_exists('myErrorHandler')){
      function myErrorHandler($severity, $message, $file = 'UNKNOWN', $line = 'UNKNOWN')
      {

         throw new ErrorException(
             $message,
             1,
             $severity,
             $file,
             $line
         );
      }

      set_error_handler('myErrorHandler');
 }

它的作用是将所有PHP错误转换为异常,或者转换为ErrorExceptoins

现在您可以更进一步,并使用这两个其他功能。

register_shutdown_function

set_exception_handler

我实际上正在努力将我使用的东西移植到它自己独立的github project。在我完成你可能感兴趣的eJinn项目之后.eJinn旨在根据配置文件构建异常类,因此每个异常文件和项目中的唯一错误代码可能会出现一个错误。

另一答案

你甚至可以在没有调用try的情况下捕获所有异常。

function hello($e)
{
  if ($e instanceof PDOException){
  echo "something".
}else echo $e->getMessage();


}


set_exception_handler('hello');

这应该抓住所有例外。

更新2

我已经编辑了代码,因此你知道使用get_class();会抛出什么异常

class mycustomException extends Exception{} // making new exception
function hello($e)
{
    if ($e instanceof PDOException){ // exception already known
        echo "something";
}else{

        echo get_class($e); // get exception name.
    }


}


set_exception_handler('hello');
throw new mycustomException(); // throw exception that we made.

以上是关于如何找出PHP代码块可能抛出的所有错误?的主要内容,如果未能解决你的问题,请参考以下文章

php 异常

异常处理

异常处理

捕获 MVC 3.0 应用程序中抛出的所有错误的干净方法?

捕获 token_get_all (Tokenizer) 抛出的错误

列出方法可能抛出的所有异常