2011-01-28 65 views
4

我經常會遇到這種情況,我稱之爲函數Foo,並且想知道這個函數可能拋出什麼異常。爲了找出我然後看看Foo的實施,但這還不夠。 Foo確實可能會調用引發異常的函數Bar如何在Delphi中記錄引發的異常?

有時我甚至會錯過Java的檢查異常處理。

因此,我覺得有必要記錄每個函數可以拋出的異常:問題是:如何?是否有關於如何記錄異常的最佳實踐?你如何處理這個問題?

+6

你爲什麼想知道哪些可能拋出異常?你應該發現異常是非常罕見的,所以知道具體類型的需求也很少見;同時,你應該認爲幾乎可以在任何時候拋出異常,例如範圍檢查,浮點數,無指針使用的訪問衝突等。 – 2011-01-28 15:52:45

+1

@Barry:可能有幾個原因(1)也許我想捕獲一個異常並拋出另一個(更合適的一個)(2)我可能想要向用戶顯示不同的錯誤對話框(或根據上下文沒有錯誤對話框)。我不是在談論違反訪問和類型的意外異常。 – jpfollenius 2011-01-31 07:38:19

回答

1

大多數Delphi應用程序都是VCL應用程序。它們不需要檢查異常,因爲主消息循環有一個try/except塊捕獲所有內容。

儘管可以通過代碼明確記錄哪些異常可以被明確提出,但這可能是一種很好的做法。

我會爲此使用XMLDoc(XML上有variousquestions她在SO上,而here is some documentation from Embarcadero)。

但請注意,底層代碼也可能引發異常。根據你對圖書館的影響,你可以或不可以保證這些都是一樣的。另一件事是操作系統:根據你運行的地方,你可以得到不同的例外。

--jeroen

1

我們使用Javadoc風格的註釋文檔。我們提取信息並用一些簡單的文本腳本生成輸出。我們也使用了DelphiCodeToDoc。

記錄異常,我們已經授權使用@throws標記。

+0

由於在方法邊界拋出異常,這有什麼用?我的意思是,如果A調用B然後拋出F,然後B調用拋出G的C,那麼方法A只會拋出異常E。我的意思是,你可以用這些信息進行哪些有用的分析? – 2011-01-28 15:05:44

+0

@David:你可以將`B`拋出的異常添加到`A`的文檔中。不同的是,你只做一次(寫`A`時),而不是每次使用`A`。不幸的是,它似乎是一個維護噩夢 - 更改`B`的異常處理現在需要使用`B`來更改所有函數的文檔 - 非常醜陋 – jpfollenius 2011-01-28 15:13:16

+1

@smasher你需要一個工具來做到這一點,我看不到這種工具如何存在。 – 2011-01-28 15:19:50

0

我用xmlDoc中的意見(見鏈接和討論here。這是基本上在接口部分的代碼中添加一個特殊類型的註釋,在屬性或方法聲明的上方。這是一個無意義的(當然)示例。如果您在代碼中添加了類似的樣式註釋,那麼當您在編寫代碼時調用它時,它們將在Code Insight中彈出,就像VCL的文檔一樣。

type 
    {$REGION 'TMyClass description'} 
    /// <summary>TMyClass is a descendent of TComponent 
    /// which performs some function.</summary> 
    {$ENDREGION} 
    TMyClass=class(TComponent) 
    private 
    // your private stuff 
    FSomeProp: Boolean; 
    procedure SetSomeProp(Value: Boolean); 
    protected 
    // your protected stuff 
    public 
    {$REGION 'TMyClass constructor'} 
    /// <summary> TMyClass constructor.</summary> 
    /// <remarks>Creates an instance of TMyClass.</remarks> 
    /// <param>Owner: TObject. The owner of the instance of TMyClass</param> 
    /// <exception>Raises EMyObjectFailedAlloc if the constructor dies 
    /// </exception> 
    {$ENDREGION} 
    Create(Owner: TObject); override; 
    published 
    {$REGION 'TMyClass.Someprop'} 
    /// <summary>Someprop property</summary> 
    /// <remarks>Someprop is a Boolean property. When True, the 
    /// thingamajig automatically frobs the widget. Changing this 
    /// property also affects the behavior of SomeOtherProp.</remarks> 
    {$ENDREGION} 
    property Someprop: Boolean read FSomeProp write SetSomeProp; 
    end; 

我更喜歡將這些XMLDoc註釋封裝在區域中,所以它們可以摺疊,除非我想編輯它們。我已經這樣做了,如果你不喜歡他們,請用{$ REGION}和{$ ENDREGION}

0

我用PasDoc用於記錄幾乎所有的我的Delphi項目。它包含一個「加註」標籤,它可以滿足您的要求。

問候 - turino