2012-07-15 58 views
0

我有一個PHP腳本會引發異常(例如無法連接到服務器)。在發展領域,我希望獲得儘可能多的信息,但在製作過程中,我不想讓遊戲離開。但是我希望能夠在兩種環境中都能正常工作的代碼,並且使我能夠進一步開發代碼。PHP異常,如何處理它們

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

編輯

是使用Apache和PHP

但如何,而無需更改代碼庫的生產環境和開發環境來區分。

+2

您是否在使用PHP與Web服務器(例如Apache?) – DPlusV 2012-07-15 07:02:27

+3

try {} catch {} finally {}? – 2012-07-15 07:02:55

+1

在php中沒有「finally」。 – MilMike 2012-07-15 07:11:33

回答

1

您通常對付這種與環境變量。它可以是啓動時加載的配置文件.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,則默認情況下此功能可用。

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) 
{ 
} 

作爲另一個回答說,你可以直接扔根據環境配置異常的流量。

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塊)將統一解決。