我有一个PHP脚本,它会抛出异常(例如无法连接到服务器)。在开发领域,我希望屏幕上有尽可能多的信息,但在制作中,我不想泄露游戏。但我想要一些在这两种环境中都能工作的代码,并使我能够进一步开发代码。
是否有规定的技术来实现这一点?
编辑
是,使用apache和PHP
但是如何在不必更改代码库的情况下区分生产环境和开发环境。
您通常使用环境变量来处理此问题。它可以是您在启动时加载的配置文件.php(或.ini、.yml、.xml,无论您对配置文件使用什么),并且具有特定于环境的值。例如,在您的生产服务器中,您的环境配置文件可能如下所示:
$config['environment'] = 'production';
另一种选择是使用web服务器提供的环境变量。这两种方法都很好,尽管我更喜欢前者。
然后,您可以用"通用错误捕获器"捕获所有未捕获的异常(也可以将错误转化为异常。在开发过程中禁用错误可能会很烦人,而启用错误而不捕获错误可能会在生产中造成巨大的安全漏洞)(我没有尝试过这个,但看起来不错。过去我用过我自己写的,但它很棘手,我不建议你自己写捕手,除了为了学习目的)。然后做这样的事情:
if($config['environment'] == 'production') {
echo 'Oops, something went wrong';
} else {
// print full backtrace and stuff
}
顺便说一句,这是一个"框架"应该为你解决的问题。如果使用Silex或Symfony 2,则默认情况下此功能可用。
您可以构建一个自定义异常类,以用户友好的方式处理异常。
class MyCoolException extends Exception
{
//Throw exceptions in a friendly way.
//Perhaps redirect them to a custom error page?
public function __construct( $error )
{
//do whatever with your error data
}
public function redirect()
{
}
}
然后,设置您的尝试/捕获模式以接受它:
try
{
}
catch( MyCoolException $e )
{
}
catch( Exception $e )
{
}
正如另一个答案所说,您可以根据环境配置来指导抛出异常的流程。
使用PHP有一种简单得多的方法。使用set_exception_handler()http://php.net/manual/en/function.set-exception-handler.php.
这个函数的作用是,每当抛出异常时,它总是调用特定的函数。您可以使用此功能检查当前环境并采取相应行动。
但你必须告诉你的剧本它在哪个环境中。为此,我同意ChocoDeveloper在他的回答中所说的。
例如:
<?php
function custom_exception_handler_function($exception) {
global $config;
if ($config['environment'] == 'production') {
continue;
} else {
throw $exception;
}
}
set_exception_handler('custom_exception_handler_function');
?>
这样,所有未捕获的异常(即不在try-catch块中的异常)都将被统一处理。