--我想知道,对于动态代码,而不是静态代码,可以抛出哪些错误是我没有捕捉到的。例如,我的代码可能在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块可以告诉我哪些异常可能被单独的方法抛出?
发布于 2017-12-24 07:41:07
您甚至无需调用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.发布于 2017-12-24 07:43:50
如果你说的是例外,你已经有答案了
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
}现在,如果您讨论的是“错误”,您可以使用自定义错误处理程序。
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。
现在,您可以更进一步,使用这两个函数。
和
实际上,我正在努力将我所用的东西移植到它自己的独立github项目上。就在我完成我的eJinn项目之后,你可能会对此感兴趣。eJinn被设计为基于配置文件构建异常类,因此每个异常文件可以有一个错误和项目中唯一的错误代码。
发布于 2017-12-24 08:02:05
您可以通过使用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
}
}注意:您应该将此代码包含在代码的顶部。
https://stackoverflow.com/questions/47958860
复制相似问题