2009-05-26 54 views
4

我在Java中使用了異常,就像它不會讓你調用方法,除非你捕獲或拋出它可能拋出的異常。確保在使用PHP時考慮所有異常

我在找尋類似於PHP的東西。我意識到PHP比Java更具動態性,甚至不會讓你定義它拋出的異常,但我能得到的最接近的是什麼?

我們使用PHP Doc記錄了我們的方法,所以如果您調用沒有正確的try/catch塊的方法觸發了E_WARNING,或者拋出了沒有正確的@thows註釋的異常,那將是完美的。

+0

有趣的問題,但我對你沒有辦法解決,我怕。 – 2009-05-26 22:46:26

+1

你運氣不好。我甚至想不出一個醜陋的方式來模擬它... – 2009-05-26 23:29:27

+0

感謝大家的好答案。它看起來像運行在源代碼上的某種形式的腳本(編譯器,靜態分析工具等)是唯一的選擇。恥辱。 – thelem 2009-05-27 08:17:22

回答

2

在PHP本身沒有辦法做到這一點。你將不得不解析PHP並自己弄清楚。請嘗試爲此寫入phc plugin

1

我不認爲你可以合理地得到非常接近的,因爲語言核心沒有提供任何與你合作的東西。充其量,你最終會創建一些完全用戶空間的funcall /異常驗證機制,這對性能有着絕對可怕的影響。

1

我不確定您是否可以完成您的既定目標。 PHP環境不分析函數可能做什麼或不可以做什麼,這通常是其他語言的編譯時操作(我認爲)。我不認爲你甚至可以通過反思找到那種東西。

但是,如果您說您無法定義引發的異常,則異常基類爲fully extendable。 PHP默認不會拋出任何異常,但會觸發錯誤。觸發錯誤和異常之間存在根本差異,後者大部分是用戶地構造。

這不是你的問題,但我提出了一個建議,如果你想轉移到一個完全面向異常的環境,你可以使用set_error_handler()編寫自己的錯誤處理程序並管理PHP觸發的錯誤,並且有它拋出一個例外。

1

我想你可以在PHP中使用異常處理程序和反射來簡單地重現此行爲。

class YourException extends Exception { 
    public function __toString() { 
    return __CLASS__; 
    } 
} 

class MyObject { 
    public function __construct(){} 
    /** 
    * @throws MyException 
    */ 
    public function myMethod() { 
     return 'foo'; 
    } 
} 

try { 
    $o = new MyObject(); 
    $o->myMethod(); 
} 
catch(YourException $e) { 
    $method = new ReflectionMethod('MyObject', 'myMethod'); 
    $method->getDocComment(); 

    $throws = // Get the @throws comment (foreach, regexp, whatever); 
    if($e === $throws) { 
     // do something 
    } 
} 

Setting your own exception handler.

Grab and analyse the comments with Reflection mechanism (see getDocComment)

相關問題