2012-01-27 127 views
53

我在Drupal 6 .module文件中有一個PHP函數。我試圖在執行更密集的任務(如數據庫查詢)之前運行初始變量驗證。在C#中,我在我的Try塊的開頭實現了IF語句,如果驗證失敗,會拋出新的異常。拋出的異常將被捕獲到Catch塊中。以下是我的PHP代碼:在PHP Try Catch塊中拋出異常

function _modulename_getData($field, $table) { 
    try { 
    if (empty($field)) { 
     throw new Exception("The field is undefined."); 
    } 
    // rest of code here... 
    } 
    catch (Exception $e) { 
    throw $e->getMessage(); 
    } 
} 

然而,當我嘗試運行代碼,它告訴我,對象只能在catch塊中被拋出。

在此先感謝!

+3

tl; dr「throw $ e-> getMessage();」應該是「扔$ e」; – 2016-07-04 18:40:21

回答

78
function _modulename_getData($field, $table) { 
    try { 
    if (empty($field)) { 
     throw new Exception("The field is undefined."); 
    } 
    // rest of code here... 
    } 
    catch (Exception $e) { 
    /* 
     Here you can either echo the exception message like: 
     echo $e->getMessage(); 

     Or you can throw the Exception Object $e like: 
     throw $e; 
    */ 
    } 
} 
+1

是的,您在Catch塊中的建議都可以解決我的問題。謝謝! – kaspnord 2012-01-27 23:15:40

0
throw $e->getMessage(); 

你試着投string

一點題外話:異常通常是在驗證後定義和應用程序的特殊狀態不是錯誤消息。它不例外,當用戶給你無效的數據時

+0

什麼是更好的方式來處理驗證? IF語句是否更適合處理無效的用戶數據? – kaspnord 2012-01-27 23:08:26

+0

總之:是的。長期以來:像發生在您的應用程序中的任何其他情況一樣,處理無效參數的出現,並顯示其他有用(錯誤)頁面。 'validateField($ validate){return empty($ validate);}'和某處例如'if validateField($ x){echo「Field is empty」;} else {doSomethingUseful();}' – KingCrunch 2012-01-28 00:15:21

+0

我看,謝謝爲解釋。 – kaspnord 2012-01-28 16:46:57

12

只需從catch塊中刪除throw - 將其更改爲echo或以其他方式處理該錯誤。

它不會告訴你只能在catch塊中拋出對象,它告訴你只能拋出對象,並且錯誤的位置在catch塊中 - 這是有區別的。

在catch塊中,你試圖拋出你剛抓到的東西 - 在這種情況下無論如何沒有什麼意義 - 而你試圖拋出的東西是一個字符串。

你現在所做的一個現實世界的類比是抓球,然後試圖把製造商的標誌扔在其他地方。你只能拋出一個完整的對象,而不是該對象的一個​​屬性。

+0

感謝您的澄清。 – kaspnord 2012-01-27 23:17:35

48

重新拋出做

throw $e; 

沒了消息。

+0

謝謝,這個解決方案最適合我的需求。 – kaspnord 2012-01-27 23:17:18

+0

這就是我的想法,很樂意提供幫助。 – 2012-01-29 07:29:23

+4

雖然會保留堆棧信息,還是會覆蓋它? – DanMan 2013-12-06 15:48:25