2010-05-07 165 views
1

我有一個自定義類,當被調用時,它將重定向到一個頁面並通過GET發送'message_type'和'message'變量。當頁面打開時,它會檢查這些變量,並根據'message_type'變量顯示'成功','警告'或'錯誤'消息。我做到了,所以用戶認爲他們留在同一頁面上。它還允許其他變量與消息一起傳遞。在PHP中處理錯誤

這是一個很好的做法,還是應該開始使用異常?

實施例:

//Call a static function that will redirect to a page, with an error message 
RedirectWithMessage::go('somepage.php', MessageType::ERROR, 'Error message here.'); 

以下checkMessage()函數是一個包含文件:

function checkMessage() 
{ 
    if((isset($_GET['message_type']) && strlen($_GET['message_type'])) && (isset($_GET['message']) && strlen($_GET['message_type']))) 
    { 
     DisplayMessage::display($_GET['message_type'], $_GET['message']); 
     return true; 
    } 
    return false; 
} 

在被重定向到頁面中,調用checkMessage();

//If a message is received, display it. If not, do nothing 
checkMessage(); 

我知道這可能是模糊的,如果有必要,我可以提供更多的代碼。我想問題是我沒有太多的使用異常的經驗,但我認爲他們看起來很麻煩(到處寫try-catch塊)。如果我讓自己變得更加困難或者有更好的解決方案,請告訴我。

謝謝! Mike

回答

1

我認爲這是一個很好的方法,我做了一些非常相似的事情,雖然我在他們的會話中保存了相關的錯誤信息($_SESSION),並在顯示後立即清除它。這使它不在查詢字符串,並使它如此,如果他們刷新頁面錯誤消失

+0

謝謝邁克爾。我喜歡將消息存儲在$ _SESSION變量中的想法。我不喜歡頁面刷新時留言的事實。 – 2010-05-07 15:56:23

0

我不確定如果例外和Try/Catch塊是要走的路,但您可能能夠在同一頁面中構建成功或錯誤消息,而無需重定向到其他頁面。

而且,此調整來IF條件更容易閱讀了一下,要達到同樣的結果:

if(!empty($_GET['message_type']) && !empty($_GET['message'])) 
+0

我讀的是empty()不是檢查變量是否包含信息的最可靠的方法。但是,你是正確的,因爲它更容易閱讀。我現在只是將它切換到你的版本。謝謝! – 2010-05-07 15:57:06

0

我用的是「如果」查了很多,因爲我永遠無法理解的try/catch語句處理。我喜歡將錯誤放在$ _SESSION中的想法。

0

有一件事是,它看起來像你的業務邏輯可能會綁定到它正在運行的PHP頁面,所以如果你想在不同的上下文中重用它的一些,你可能會盯着你,因爲你會被卡住讓它重定向到錯誤的特定頁面。

如果使用異常,您可以選擇立即捕獲該錯誤並繼續,或者讓它處理得更高(例如放棄並向用戶顯示錯誤頁面)。

+0

謝謝湯姆。我不確定我是否確切地遵守。你會描述一下與代碼運行的PHP頁面綁定的是什麼? – 2010-05-07 16:03:35

+0

@Mike:我的意思是說,如果你試圖在不同的項目中使用它,你可能會很困難,因爲所有的錯誤處理都是硬編碼的,以使用戶跳轉到另一個特定的頁面。但在你的情況下這可能不是問題。這只是我的一個想法。 – 2010-05-07 17:25:47

+0

哎呀,謝謝! – 2010-05-07 18:58:56

1

錯誤和異常並不完全相同。例外情況是指「無法連接到數據庫」,「無法連接到外部資源或可能是您認爲是導致應用程序暫停的異常的用戶條目」等「特殊情況」的錯誤。由於使用異常,您可以在模型/業務對象中實現錯誤冒泡,並且只需在調用堆棧中捕獲錯誤(理想情況下在控制器或主頁面中,如果不使用MVC模式)。如果你想直接拋出消息,那很好,但你可能只想使用錯誤代碼,這樣你就可以簡單地用它們各自的消息創建一個對象或錯誤數組,甚至支持同一錯誤的本地化或消息變體。一旦將錯誤作爲例外發現,您可以將其緩存到一個變量中,並將其顯示在模板或視圖中,或者重定向到一個常見的消息頁面。

<?php 
    class SampleModel 
    { 
     public function validate($params) 
     { 
      if (!is_array($params)) { 
       throw new Exception("Input provided is not valid"); 
      } 
      //add as many validations as you want. 
      return TRUE; 
     } 
    } 
?> 

用法:

<?php 
     $model = new SampleModel(); 
     $input = "not an array"; 
     $msg = null;  
     $msgtype = null; 
     try {  
      $result = $model->validate($input); //this will throw a user-defined exception because we are passing a string instead of an array 
      if ($result) { 
       $msgtype = "success"; 
       $msg = "Successful validation"; 
      } 

     } catch(Exception $e) { 
      $msg = $e->getMessage(); 
      $msgtype = "Fatal error"; 
     } 

     RedirectWithMessage::go('somepage.php', $msgtype, $msg); 

如果你不絕對需要重定向,只需加載一組不同的頁面模板的是錯誤的類型。

 //load the appropriate template/view class. You need to create this class or use a framework. 
     LoadWithMessage::display('sometemplate.inc.php', $msgtype, $msg); 

上述樣本代碼通常是控制器。

此外,$ _SESSION的性能開銷,更不用說額外的延遲一旦你去分佈式(如果你期望你的應用程序是大)。我真的不會建議將它用於錯誤消息。我通常只是用它來保存數據。錯誤消息並不意味着持續存在,網絡本質上是無狀態的。

+0

哇!謝謝。我認爲還有更多。我必須在早上看這個。 – 2010-05-07 21:18:16