[英]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.