2014-01-29 58 views
1

我正在實現一些性能計數器,我想知道您的意見。 問題是我應該聲明響應並將它在try塊之外返回,或者可以直接在try塊中返回它。是否有區別?如果是這樣,什麼樣的代碼是有效的(如果有的話)。在嵌套try catch塊中返回結果

以最好的問候,no9。

public string TestMethod(string document) 
{ 
    try 
    { 
    WebService ws = new WebService(); 
    string response = null; 
    var startTime = PerformanceCounter.GetPerformanceCounterStartTimeHandle(); 

    try 
    { 
     response = ws.InsertDocument(document); 
    } 
    catch (Exception ex) 
    { 
     PerformanceCounterHelper.Increment(PerformanceCounterEnum.NumberOfExternalWsCallsExceptionOnSec); 
     throw; 
    } 
    finally 
    { 
     PerformanceCounterHelper.IncrementPerformanceCounterByElapsedTime(PerformanceCounterEnum.DurationOfExternalCallsInSec, startTime); 
     PerformanceCounterHelper.Increment(PerformanceCounterEnum.NumberOfExternalCallsOnSec); 
    } 

    return response; 
    } 
    catch (Exception ex) 
    { 
    log.EventError(ex); 
    throw new DocumentGeneralException(); 
    } 
} 

對:

public string TestMethod(string document) 
{ 
    try 
    { 
    WebService ws = new WebService(); 
    var startTime = PerformanceCounter.GetPerformanceCounterStartTimeHandle(); 

    try 
    { 
     return ws.InsertDocument(document); 
    } 
    catch (Exception ex) 
    { 
     PerformanceCounterHelper.Increment(PerformanceCounterEnum.NumberOfExternalWsCallsExceptionOnSec); 
     throw; 
    } 
    finally 
    { 
     PerformanceCounterHelper.IncrementPerformanceCounterByElapsedTime(PerformanceCounterEnum.DurationOfExternalCallsInSec, startTime); 
     PerformanceCounterHelper.Increment(PerformanceCounterEnum.NumberOfExternalCallsOnSec); 
    } 
    } 
    catch (Exception ex) 
    { 
    log.EventError(ex); 
    throw new DocumentGeneralException(); 
    } 
} 
+0

我會堅持第一個變體。雖然在try-catch塊中賦值是可以的,但控制流應放置在它之外。 – Taosique

+0

謝謝Taosique – no9

回答

1

只要沒有因爲不離開的差(即它運行附加的/不同的代碼),則該代碼是相同的。實際上,在IL級別,它是從一個try/catch內部的非法ret,所以編譯器所做的一件事就是完成你所做的事情:引入一個本地,在try/catch內部分配本地,然後在以外返回該值 try/catch。

基本上,無論是最簡單,最方便閱讀。就你而言,我會說「第一個」。

+0

感謝您爲我清理它。 – no9