捕获所有PHP异常是最佳实践吗?
对于任何可能引发异常的PHP,可以将其封装在try-catch块中。例如: //收集文件列表 试一试{ $optParams=[ 'orderBy'=>'modifiedTime', “pageSize”=>$count,谷歌默认值为100,最大值为1000 'q'=>mimeType='application/vnd.google apps.spreadsheet'和modifiedTime>='$modifiedAfter', '字段'=>'下一个GetOken,文件ID,修改时间' ]; $results=$googleService->files->listFiles$optParams; foreach$results->getFiles as$file{ 如果$file->getModifiedTime getId getId]=$file->getModifiedTime; } 返回$retval; }catch\Google\u服务\u异常$e{ echo“错误谷歌服务:”; echo json_encode$e->getErrors; 返回null; }捕获所有PHP异常是最佳实践吗?,php,Php,对于任何可能引发异常的PHP,可以将其封装在try-catch块中。例如: //收集文件列表 试一试{ $optParams=[ 'orderBy'=>'modifiedTime', “pageSize”=>$count,谷歌默认值为100,最大值为1000 'q'=>mimeType='application/vnd.google apps.spreadsheet'和modifiedTime>='$modifiedAfter', '字段'=>'下一个GetOken,文件ID,修改时间' ];
如果捕获错误是最佳实践,人们应该如何评估呢?不,处理每一个可能的异常都不是好的实践 在您预期可能发生异常并且可以处理异常的地方,或者在您需要以特定方式(例如取消某些操作)优雅地失败的地方,处理异常。如果还有别的事,就让它崩溃吧 如果捕获了所有异常,那么调试就会变得困难。此外,如果不重新抛出或退出,则有可能在代码的其他地方导致意外结果 在上面的特定示例中,如果要输出特定的错误消息,请使用自己的异常包装内部异常,并使用通用错误处理程序输出该消息
异常和try/catch是要使用的流控制工具。编写健壮代码的一部分是确保它在脱离轨道时安全地停止。不,处理每一个可能的异常都不是好的做法 在您预期可能发生异常并且可以处理异常的地方,或者在您需要以特定方式(例如取消某些操作)优雅地失败的地方,处理异常。如果还有别的事,就让它崩溃吧 如果捕获了所有异常,那么调试就会变得困难。此外,如果不重新抛出或退出,则有可能在代码的其他地方导致意外结果 在上面的特定示例中,如果要输出特定的错误消息,请使用自己的异常包装内部异常,并使用通用错误处理程序输出该消息 异常和try/catch是要使用的流控制工具。编写健壮代码的一部分是确保它在脱离轨道时安全地停止。正如phpdelusions上所说: 尽管存在广泛的错觉,但您永远不应该捕捉错误来报告它们。像数据库层这样的模块不应报告其错误。此函数必须委托给应用程序范围的处理程序。我们所需要的只是以异常的形式提出一个错误——我们已经这样做了。这就是全部。您也不应该总是像tutsplus推荐的最流行的教程那样,将PDO操作包装在try/catch中。恰恰相反,捕获异常应该是一个特例双关语 事实上,PDO异常没有什么特别之处——它们都是错误。因此,您必须像对待其他错误一样对待它们。如果您以前有错误处理程序,则不应该为PDO创建专用的错误处理程序。如果你不在乎的话,也没关系,因为PHP很好地处理了基本的错误,并且可以很好地处理PDO异常 正如PHPD上所说的: 尽管存在广泛的错觉,但您永远不应该捕捉错误来报告它们。像数据库层这样的模块不应报告其错误。此函数必须委托给应用程序范围的处理程序。我们所需要的只是以异常的形式提出一个错误——我们已经这样做了。这就是全部。您也不应该总是像tutsplus推荐的最流行的教程那样,将PDO操作包装在try/catch中。恰恰相反,捕获异常应该是一个特例双关语 事实上,PDO异常没有什么特别之处——它们都是错误。因此,您必须像对待其他错误一样对待它们。如果您以前有错误处理程序,则不应该为PDO创建专用的错误处理程序。如果你不在乎的话,也没关系,因为PHP很好地处理了基本的错误,并且可以很好地处理PDO异常
为了突出Ebski的上述评论,您应该尝试某种形式的全局处理。所以要回答您的问题,是的,所有内容都应该围绕一个try-catch,它可以处理在文件中存储堆栈跟踪,并向用户打印漂亮的消息。这里有一个例子
/** Attempt to safely catch errors and public alerts in a closure
* @param callable $lambda
* @return callable
*/
public static function catchErrors(callable $lambda): callable
{
return function (...$argv) use ($lambda) {
try {
ob_start(null,null, PHP_OUTPUT_HANDLER_CLEANABLE | PHP_OUTPUT_HANDLER_FLUSHABLE | PHP_OUTPUT_HANDLER_REMOVABLE);
$argv = \call_user_func_array($lambda, $argv);
} catch (\Throwable $e) {
if (!$e instanceof PublicAlert) {
PublicAlert::danger('Developers make mistakes, and you found a big one! We\'ve logged this event and will be investigating soon.'); // TODO - Change what is logged
if (APP_LOCAL) {
PublicAlert::warning(\get_class($e) . $e->getMessage());
}
try {
ErrorCatcher::generateLog($e);
} catch (\Throwable $e) {
PublicAlert::danger('Error handling failed.');
print $e->getMessage();
PublicAlert::info(json_encode($e));
}
} //elseif (APP_LOCAL) {
// Why did we do this
// ErrorCatcher::generateLog($e);
//}
/** @noinspection CallableParameterUseCaseInTypeContextInspection */
$argv = null;
} finally {
if (ob_get_status() && ob_get_length()) {
$out = ob_get_contents();
ob_end_clean();
print <<<END
<div class="callout callout-info">
<h4>You have printed to the screen while within the catchErrors() function!</h4>
Don't slip up in your production code!
<a href="http://carbonphp.com/">Note: All MVC routes are wrapped in this function. Output to the browser should be done within the view! Use this as a reporting tool only.</a>
</div><pre>$out</pre>
END;
}
Database::verify('Check that all database commit chains have finished successfully. You may need to self::commit().'); // Check that all database commit chains have finished successfully, otherwise attempt to remove
return $argv;
}
};
}
为了突出Ebski的上述评论,您应该尝试某种形式的全局处理。所以要回答您的问题,是的,所有内容都应该围绕一个try-catch,它可以处理在文件中存储堆栈跟踪,并向用户打印漂亮的消息。这里有一个例子
/** Attempt to safely catch errors and public alerts in a closure
* @param callable $lambda
* @return callable
*/
public static function catchErrors(callable $lambda): callable
{
return function (...$argv) use ($lambda) {
try {
ob_start(null,null, PHP_OUTPUT_HANDLER_CLEANABLE | PHP_OUTPUT_HANDLER_FLUSHABLE | PHP_OUTPUT_HANDLER_REMOVABLE);
$argv = \call_user_func_array($lambda, $argv);
} catch (\Throwable $e) {
if (!$e instanceof PublicAlert) {
PublicAlert::danger('Developers make mistakes, and you found a big one! We\'ve logged this event and will be investigating soon.'); // TODO - Change what is logged
if (APP_LOCAL) {
PublicAlert::warning(\get_class($e) . $e->getMessage());
}
try {
ErrorCatcher::generateLog($e);
} catch (\Throwable $e) {
PublicAlert::danger('Error handling failed.');
print $e->getMessage();
PublicAlert::info(json_encode($e));
}
} //elseif (APP_LOCAL) {
// Why did we do this
// ErrorCatcher::generateLog($e);
//}
/** @noinspection CallableParameterUseCaseInTypeContextInspection */
$argv = null;
} finally {
if (ob_get_status() && ob_get_length()) {
$out = ob_get_contents();
ob_end_clean();
print <<<END
<div class="callout callout-info">
<h4>You have printed to the screen while within the catchErrors() function!</h4>
Don't slip up in your production code!
<a href="http://carbonphp.com/">Note: All MVC routes are wrapped in this function. Output to the browser should be done within the view! Use this as a reporting tool only.</a>
</div><pre>$out</pre>
END;
}
Database::verify('Check that all database commit chains have finished successfully. You may need to self::commit().'); // Check that all database commit chains have finished successfully, otherwise attempt to remove
return $argv;
}
};
}
我认为在可能的情况下,应该抓住每一个例外。这就是全部
让您的应用程序优雅地处理错误。可能是回滚数据库事务,或者只是向用户显示一个用户友好的错误消息,而不是一个普通的500内部服务器错误。PHP异常是否有什么不同之处,使得这个问题对于该语言来说是唯一的?更一般的问题是:我是否应该总是捕获异常而不管语言如何?我认为在可能的情况下,应该捕获每个异常。这样,应用程序就可以优雅地处理错误。可能是回滚数据库事务,或者只是向用户显示一个用户友好的错误消息,而不是一个普通的500内部服务器错误。PHP异常是否有什么不同之处,使得这个问题对于该语言来说是唯一的?更一般的问题是:我是否应该总是捕捉到异常,而不管语言如何?我在某种程度上不同意这一点。我总是设置一些全局异常处理,以确保应用程序不会崩溃,但确保记录抛出的异常以使调试成为可能。不过,我不会专门捕获每个异常,只捕获您所说的预期会发生的异常。@Ebski是的,全局异常处理很好。完全同意。我的评论是针对那些认为他们需要1001个try/catch块的人的。我在一定程度上不同意这一点。我总是设置一些全局异常处理,以确保应用程序不会崩溃,但确保记录抛出的异常以使调试成为可能。不过,我不会专门捕获每个异常,只捕获您所说的预期会发生的异常。@Ebski是的,全局异常处理很好。完全同意。我的评论是针对那些认为他们需要1001个try/catch块的人的。谢谢。当然phpdelusions.net代表了PHP编程的最佳实践。他们在这个问题上有一个处方,为如何评估在任何特定情况下是否应该捕获异常提供了一个明确的处方。谢谢。当然phpdelusions.net代表了PHP编程的最佳实践。他们在这个主题上开了一个处方,提供了一个明确的处方,说明如何评估异常是否应该在任何特定的环境中被捕获。如果你要在PHP方面做这件事,请考虑适当地使用StIsExabutyHythult/StjyError处理程序。但是,如果您对用户的错误是一般性的,请在web服务器级别执行错误页面输出。然后你可以处理其他类型的失败,比如PHP配置错误。我同意brad的观点,但知道当你从这些函数返回true时会发生什么。用于套接字。这只意味着要围绕站点的逻辑部分进行包装。我将参考完整的文件来了解这两种方法的使用。如果您打算在PHP方面做这件事,请考虑使用StIGExpExtIXHythult/StEngReRoRyHub处理程序。但是,如果您对用户的错误是一般性的,请在web服务器级别执行错误页面输出。然后你可以处理其他类型的失败,比如PHP配置错误。我同意brad的观点,但知道当你从这些函数返回true时会发生什么。用于套接字。这只意味着要围绕站点的逻辑部分进行包装。我将参考完整的文件来了解这两种方法的使用。