我有一个PHP脚本会抛出异常(例如无法连接到服务器)。在开发领域,我希望在屏幕上提供尽可能多的信息,但在制作中我不想让游戏消失。但我想要一些适用于这两种环境的代码,这也使我能够进一步开发代码。
是否有规定的技术来实现这一目标?
修改
是的,使用带有PHP的apache
但是如何在不必更改代码库的情况下区分生产环境和开发环境。
答案 0 :(得分:1)
您通常使用环境变量处理此问题。它可以是您在启动时加载的配置文件.php(或.ini,.yml,.xml,无论您用于配置文件),并且具有特定于环境的值。例如,在生产服务器中,您的环境配置文件可能如下所示:
$config['environment'] = 'production';
另一种选择是使用Web服务器提供的环境变量。两种方法都很好,但我更喜欢前者。
然后你捕获所有未被捕获的异常(并且还将错误转化为异常。在开发过程中禁用错误可能会令人讨厌,并且启用错误并且没有捕获它们可能是生产中的巨大安全漏洞)'universal error catcher' (我没试过这个,但看起来不错。过去我用的是我自己写过的,但它非常棘手,我不建议你自己写一个捕手,除了学习目的)。然后做这样的事情:
if($config['environment'] == 'production') {
echo 'Oops, something went wrong';
} else {
// print full backtrace and stuff
}
作为旁注,这是“框架”应该为您解决的问题。如果您使用Silex或Symfony 2,则默认情况下此功能可用。
答案 1 :(得分:0)
您可以构建一个自定义异常类,以用户友好的方式处理异常。
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模式接受它:
try
{
}
catch( MyCoolException $e )
{
}
catch( Exception $e )
{
}
正如另一个答案所说,你可以根据环境配置指导抛出异常的流程。
答案 2 :(得分:0)
使用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块中的异常)将统一处理。