【问题标题】:PHP exceptions, how to handle themPHP 异常,如何处理它们
【发布时间】:2012-07-15 07:00:17
【问题描述】:

我有一个 PHP 脚本会抛出异常(例如,无法连接到服务器)。在开发领域,我希望在屏幕上显示尽可能多的信息,但在生产中,我不想泄露游戏。但我想要一些在这两种环境中都可以工作的代码,并且还能让我进一步开发代码。

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

编辑

是的,在 PHP 中使用 apache

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

【问题讨论】:

  • 你在使用 PHP 和 Web 服务器(比如 Apache?)
  • php 中没有“finally”。
  • 这是一个完全有效的问题,不应被否决。
  • Ed,你想显示什么类型的错误......或者你基本上想调试什么?它是否从脚本连接到您的 mysql 服务器?

标签: php


【解决方案1】:

您通常使用环境变量来处理这个问题。它可以是您在启动时加载的配置文件 .php(或 .ini、.yml、.xml,无论您使用什么配置文件),并且具有特定于环境的值。例如,在您的生产服务器中,您的环境配置文件可能如下所示:

$config['environment'] = 'production';

另一种选择是使用您的网络服务器提供的环境变量。两种方法都很好,虽然我更喜欢前者。

然后你用'universal error catcher'(我这个没试过,但是看起来不错。以前用过自己写的,但是很棘手,不建议自己写捕手,除非是学习用)。然后做这样的事情:

if($config['environment'] == 'production') {
    echo 'Oops, something went wrong';
} else {
    // print full backtrace and stuff
}

作为旁注,这是“框架”应该为您解决的问题。如果您使用 Silex 或 Symfony 2,此功能默认可用。

【讨论】:

    【解决方案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 模式以接受它:

    try
    {
    }
    catch( MyCoolException $e )
    {
    }
    catch( Exception $e )
    {
    }
    

    正如另一个答案所说,您可以根据环境配置指导引发异常的流程。

    【讨论】:

      【解决方案3】:

      使用 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 块中的异常)都将得到统一处理。

      【讨论】:

        猜你喜欢
        • 2012-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-13
        • 1970-01-01
        • 2014-10-19
        • 2013-02-25
        相关资源
        最近更新 更多