PHP异常,如何处理它们

时间:2012-07-15 07:00:17

标签: php

我有一个PHP脚本会抛出异常(例如无法连接到服务器)。在开发领域,我希望在屏幕上提供尽可能多的信息,但在制作中我不想让游戏消失。但我想要一些适用于这两种环境的代码,这也使我能够进一步开发代码。

是否有规定的技术来实现这一目标?

修改

是的,使用带有PHP的apache

但是如何在不必更改代码库的情况下区分生产环境和开发环境。

3 个答案:

答案 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块中的异常)将统一处理。