我經常會遇到這種情況,我稱之爲函數Foo
,並且想知道這個函數可能拋出什麼異常。爲了找出我然後看看Foo
的實施,但這還不夠。 Foo
確實可能會調用引發異常的函數Bar
。如何在Delphi中記錄引發的異常?
有時我甚至會錯過Java的檢查異常處理。
因此,我覺得有必要記錄每個函數可以拋出的異常:問題是:如何?是否有關於如何記錄異常的最佳實踐?你如何處理這個問題?
我經常會遇到這種情況,我稱之爲函數Foo
,並且想知道這個函數可能拋出什麼異常。爲了找出我然後看看Foo
的實施,但這還不夠。 Foo
確實可能會調用引發異常的函數Bar
。如何在Delphi中記錄引發的異常?
有時我甚至會錯過Java的檢查異常處理。
因此,我覺得有必要記錄每個函數可以拋出的異常:問題是:如何?是否有關於如何記錄異常的最佳實踐?你如何處理這個問題?
大多數Delphi應用程序都是VCL應用程序。它們不需要檢查異常,因爲主消息循環有一個try/except塊捕獲所有內容。
儘管可以通過代碼明確記錄哪些異常可以被明確提出,但這可能是一種很好的做法。
我會爲此使用XMLDoc(XML上有variousquestions她在SO上,而here is some documentation from Embarcadero)。
但請注意,底層代碼也可能引發異常。根據你對圖書館的影響,你可以或不可以保證這些都是一樣的。另一件事是操作系統:根據你運行的地方,你可以得到不同的例外。
--jeroen
我們使用Javadoc風格的註釋文檔。我們提取信息並用一些簡單的文本腳本生成輸出。我們也使用了DelphiCodeToDoc。
記錄異常,我們已經授權使用@throws標記。
由於在方法邊界拋出異常,這有什麼用?我的意思是,如果A調用B然後拋出F,然後B調用拋出G的C,那麼方法A只會拋出異常E。我的意思是,你可以用這些信息進行哪些有用的分析? – 2011-01-28 15:05:44
@David:你可以將`B`拋出的異常添加到`A`的文檔中。不同的是,你只做一次(寫`A`時),而不是每次使用`A`。不幸的是,它似乎是一個維護噩夢 - 更改`B`的異常處理現在需要使用`B`來更改所有函數的文檔 - 非常醜陋 – jpfollenius 2011-01-28 15:13:16
@smasher你需要一個工具來做到這一點,我看不到這種工具如何存在。 – 2011-01-28 15:19:50
我用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}
這是記錄代碼尋找偉大的線 - 從DevJet.net
Documentation Insight我用PasDoc用於記錄幾乎所有的我的Delphi項目。它包含一個「加註」標籤,它可以滿足您的要求。
問候 - turino
你爲什麼想知道哪些可能拋出異常?你應該發現異常是非常罕見的,所以知道具體類型的需求也很少見;同時,你應該認爲幾乎可以在任何時候拋出異常,例如範圍檢查,浮點數,無指針使用的訪問衝突等。 – 2011-01-28 15:52:45
@Barry:可能有幾個原因(1)也許我想捕獲一個異常並拋出另一個(更合適的一個)(2)我可能想要向用戶顯示不同的錯誤對話框(或根據上下文沒有錯誤對話框)。我不是在談論違反訪問和類型的意外異常。 – jpfollenius 2011-01-31 07:38:19