2013-08-16 48 views
0

是否有可能獲得有關方法返回的運行時信息?瞭解該方法返回的部分

我的意思是,如果該方法在運行其所有代碼行之後返回,或者由於某種情況而發生的較早的 返回語句。

該場景使用攔截器來創建應存在於方法範圍內的UnitOfWork。 例如,讓我們考慮這樣的代碼:

[UnitOfWork] 
public void Foo() 
{ 
    // insert some values to the database, using repositories interfaces... 
    DoSomeChangesInTheDataBaseUsingRepositories(); 
    var result = DoSomethingElse(); 
    if (!result) return; 

    DoMoreLogicBecuseTheResultWasTrue();    
} 

我有打開螺紋工作的靜態單位來表示該標記有[的UnitOfWork],並且當該方法的範圍結束運行它提交的UOW方法攔截器類並處置它。

這很好,但讓我們考慮一下上面的場景,由於某些原因,程序員因某種原因決定返回方法的中間位置,並且在這種情況下,存儲庫所做的更改不應保留。

我知道這可能表明該方法的設計錯誤,但請注意,這是一個可能由程序員編寫的場景,我想從這些場景中捍衛我的數據庫。

此外,我不想向方法本身添加代碼,它會告訴我它在哪裏結束。我想通過方法info以某種方式推斷它的返回點,並且如果它不在其範圍的末端,攔截器將知道不會提交。

+6

您的場景是什麼?您想完成什麼? –

+1

並非沒有合作/重寫。 –

+0

創建一些日誌 –

回答

3

簡單的答案是使用BREAKPOINTS和調試。

編輯: -正如梅爾斯在評論中所述。這可能是一個有用的建議。

如果您的應用程序對時序非常敏感,請設置條件斷點,以免它們實際上停止執行流程。他們確實跟蹤Hit Count,你可以用它來回溯執行流程。

只是爲了您的關注。從Microsoft網站: -

對於那些在那裏誰擁有經驗調試本機C++或VB6 代碼,你可能使用了一個功能,函數的返回值是在自動窗口爲您提供 。遺憾的是,託管代碼不存在這種 功能。雖然通過將返回值分配給局部變量 可以在此問題的周圍工作 ,但這並不方便,因爲它需要修改代碼。在 託管代碼中,確定返回值 是否跨過了一個棘手的問題。我們意識到我們不能在這裏始終如一地對待 ,因此我們刪除了功能 ,而不是在調試器中給出錯誤的結果。不過,我們希望 爲您帶來這回,我們的CLR和調試器團隊正在尋找 一些潛在的解決方案來解決這個問題。不幸的是,這是 將不會是Visual Studio 11的一部分。

+1

它將在VS 2013.這是主要的新功能:-) – xanatos

+0

@xanatos: - 是的,我聽說過它! :) –

+0

真的嗎?真棒! – Gusdor

0

通常,如果您不能調試它,應該使用跟蹤日誌來監視代碼流。

+0

看看我的更新 –

0

你總是可以做這樣的事情:

private Tuple<int, MyClass> MyMethod() 
{ 
    if (condition) 
    { 
     return new Tuple<int, MyClass>(0,new MyClass()); 
    } 
    else if(condition) 
    { 
     return new Tuple<int, MyClass>(1, new MyClass()); 
    } 

    return new Tuple<int, MyClass>(2,new MyClass()); 
} 

這樣you'll具有的收益率爲退回MyClass的對象的索引。一切取決於你想要完成什麼以及爲什麼 - 這至多不清楚。正如別人提到的那樣 - 這就是返回值的意義。

我珍玩知道你正在嘗試做的...

1

有一對夫婦的方式,通常表明一個方法早因爲某種原因退出,一個是,如果使用實際的返回值,值是一個有效的結果,然後你的方法可能是正確結束,如果它的另一個值,則可能不會,這是最TryXXX方法遵循

int i; 
//returns false as wasn't able to complete 
bool passed = int.TryParse("woo", out i); 

另一種是趕上/模式trhow異常,如有異常被發現,那麼該方法沒有像你期望的那樣完成

try 
{ 
Method(); 
} 
catch(Exception e) 
{ 
//Something went wrong (e.StackTrace) 
} 

注:捕獲Exception是一個壞主意,正確的異常應該被捕獲,即NullReferenceException

編輯:

在回答您的更新,如果你的代碼是依賴於成功您應該將返回類型更改爲布爾值或其他值,如果不成功則返回false

+1

以上,使用異常作爲正常的程序流也是不好的(即「因爲我拋出異常而不保存」)。不是說你應該刪除它,只是爲了閱讀和思考使用它。 – Default

+0

我同意,默認。我已經在回答中,因爲我已經讀過(原始)問題,因爲如何判斷方法沒有正確完成 – Sayse