簡體   English   中英

PHP異常,如何處理它們

[英]PHP exceptions, how to handle them

我有一個PHP腳本,它將引發異常(例如,無法連接到服務器)。 在開發領域,我希望在屏幕上顯示盡可能多的信息,但是在生產中,我不想放棄游戲。 但是我想要一些在兩種環境下都可以使用的代碼,並且還使我能夠進一步開發代碼。

是否有規定的技術來實現這一目標?

編輯

是的,將Apache與PHP一起使用

但是如何在不更改代碼庫的情況下區分生產環境和開發環境。

您通常使用環境變量來處理它。 它可以是在啟動時加載的配置文件.php(或.ini,.yml,.xml,無論您使用什么配置文件),並具有特定於環境的值。 例如,在生產服務器中,環境配置文件可能如下所示:

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

另一種選擇是使用Web服務器提供的環境變量。 兩種方法都很好,盡管我更喜歡前一種方法。

然后,您會使用“通用錯誤捕獲器” (I haven)捕獲所有未捕獲的異常(並將錯誤轉化為異常。禁用錯誤可能在開發過程中很煩人,而啟用錯誤而不捕獲它們可能是生產中的巨大安全漏洞)。 “沒有嘗試過,但是看起來不錯。在過去,我用我自己寫的,但這很棘手,除了學習用途之外,我不建議您編寫自己的捕手”。 然后只需執行以下操作:

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模式以接受它:

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

另一個答案是,您可以根據環境配置指導拋出異常的流程。

使用PHP有一種簡單得多的方法。 使用set_exception_handler() http://php.net/manual/zh/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塊中的異常)將得到統一處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM