2013-02-28 64 views
2

我與DefaultTraceListener問題(這是唯一的跟蹤偵聽器,如果沒有的app.config覆蓋)時,如果AssertUiEnabledfalse(即ASP.NET)寫入異常在失敗的斷言(調用Trace.Assert(false)),上的消息爲OutputDebugString,但繼續執行一個TraceListener的,它拋出一個失敗的斷言

所以我使用下面的TraceListener的子類,它會拋出異常。我激活它使用

TraceListenerWhichThrowsExceptionOnFail.InsertAsFirstTraceListener(Trace.Listeners); 

Application_Init

現在,在Application_Error事件中,我可以使用完整堆棧跟蹤記錄異常(如任何異常),包括調用Trace.Assert(false)

public class TraceListenerWhichThrowsExceptionOnFail : TraceListener 
{ 
    public static void InsertAsFirstTraceListener(TraceListenerCollection traceListeners) 
    { 
     traceListeners.Insert(0, new TraceListenerWhichThrowsExceptionOnFail()); 
    } 

    public override void Fail(string message, string detailMessage) 
    { 
     message = string.IsNullOrEmpty(detailMessage) ? message : message + ", Detail message: " + detailMessage; 

     throw new ApplicationException("Trace assertion failed" + 
      (string.IsNullOrEmpty(message) ? "" : ": " + message) + "."); 
    } 

    public override void Write(string message) 
    { 
     // NOP 
    } 

    public override void WriteLine(string message) 
    { 
     // NOP 
    } 
} 

現在我的問題:有沒有人看到這種方法的問題?

+1

貌似問題更適合代碼審查網站 – 2013-02-28 22:34:10

回答

0

我會說在Trace.Assert中的例外是壞主意(不看你的代碼)。

Trace.XXXX方法通常用於跟蹤內容。對未來的讀者(包括你)來說,要知道Trace.Assert實際上會引發異常會非常令人驚訝。

看到Trace.Assert(甚至失敗)拋出異常更令人驚訝。 Assert的目的是提前幫助識別問題,而不是爲了殺死應用程序。

我建議您想出自定義方法,清楚地顯示其名稱中的行爲,而不是提出現有方法的意外行爲。

+0

'Trace.Assert'不會引發異常。 'Trace.Assert(false)'(表示出錯了)確實如此。 – moop 2013-03-01 00:38:08

+0

@meepgoose,不知道你在評論什麼。我把你的問題看作是「可以讓大多數人不會期望的特定方法行事(即拋出異常,當正常行爲從來不會拋出,而不管參數)」並以這種方式回答。我對預期行爲的理解很好,可能是錯誤的,所以如果有人期望你已經實施的行爲,請與你認識/工作的人覈對一下。 – 2013-03-01 01:11:57

+0

我在這一個moop。 「追蹤」。XXX方法確實通常是爲了追蹤東西,我可以很容易地提出這樣的論點,即XXX.Assert方法通常意味着停止執行你的程序,因爲你的邏輯中存在一些不變的違規行爲。此外,我還會聲稱'Trace.Assert'是'Debug.Assert'的釋放模式等價物。 MSDN本身說:*如果您想在發佈版本中進行斷言,請使用Trace.Assert方法。 Debug.Assert方法僅適用於調試版本*。在這個前提下,'Trace.Assert'比日誌更有意義。 – 2015-12-25 09:43:24

0

這取決於。

我不確定這將在ASP.NET場景中有用。在調試過程中,您希望斷言行爲正常。拋出異常可能會有點混淆。而在生產中,你會使用發佈版本,這樣Trace.Assert陳述無論如何都不會做任何事情。

但是,我們使用類似的技術進行單元測試。你真的不希望你的構建服務器掛起顯示「Assertion Failed」消息框。相反,你希望你的斷言導致測試失敗。所以我們使用一個App.config文件來進行單元測試(並且只用於軟管!),它會安裝一個類似於你的跟蹤監聽器。

+0

默認的「Release」配置(我沒有更改)啓用了「TRACE」條件。你的意思是'DEBUG'條件(只在「調試」配置中啓用)。 – moop 2013-03-01 00:34:23

-1

在Fail()中拋出異常可能會導致: 1.調用堆棧會引起混淆,因爲異常不會在條件失敗附近拋出。

通常你應該在條件失敗的地方附近拋出異常。