PHP异常,如何处理它们


PHP exceptions, how to handle them

我有一个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块中的异常)都将被统一处理。