2016-04-02 48 views
1

問題: 我相信我在編程這裏缺少一些重點。我想創建一些代碼路徑不返回任何東西的方法。例如用於錯誤處理。如何故意有一個代碼路徑不返回一個int值在C#

例子: public static int calculateArea(int width, int length){ if(length < 0 || width < 0){ //don't want to return anything as negative distance is impossible //Execute my error handling here } else{ int area = length * width; return area; } }

問題:很簡單,有沒有辦法覆蓋的事實,你必須返回所有代碼路徑的值?

潛在解決方案我在網上看到過一個解決方案,其中錯誤處理代碼路徑返回一個特定值,因此您知道忽略它。但是,這似乎是一個非常不穩定的解 如果有更好的方法來編寫這些類型的方法,我很樂意重構我的代碼。

爲什麼這個問題是原創的:我覺得這個問題是原創的,因爲我一直無法找到一個具體的答案在網上或在SO論壇。

+1

'的問題:很簡單,有沒有辦法覆蓋的事實,你必須在所有代碼路徑中返回一個值?'很簡單** NO **,'我認爲這個問題是原創的'不,你只需要閱讀更多關於c#/。Net – Eser

+3

你可以拋出異常。 – juharr

+0

@juharr如果拋出一個異常,你不必返回一個值? –

回答

3

這裏有兩種語句,在C#中被認爲的方法:returnthrow

在你的情況下,如果距離爲負值應該拋出ArgumentExceptionArgumentOutOfRangeException

在另一方面,因爲這是關於參數驗證你應該看看code contracts

public static int CalculateArea(int width, int length) 
{ 
    Contract.Requires(length > -1 && width > -1, "Distance must be positive"); 

    int area = length * width; 

    return area; 
} 
+0

這實際上是一個很好的解決方案。 – mhenkel

+0

@mhenkel按合同設計是一種非常富有表現力且令人愉快的使用代碼定義代碼要求的方式! :) –

+0

@MatíasFidemraizer它似乎很酷,但得到一些奇怪的過程中的錯誤 –

2

如果您不想返回可用值,請使用空值Int代替:int?return null

+0

對我來說,這與返回-1或誰知道什麼幾乎相同。 –

+0

是的,這是真的,這不是一個好的解決方案,因爲你將不得不重新檢查該方法的結果再次... – mhenkel

1

你想要做的就是拋出異常。

Throw new Exception("Length and width cannot be negative."); 

只要你把你會看到你的編譯器錯誤消失,因爲函數沒有返回的代碼路徑 - 它與異常退出。

您也可以使用您的異常類型更具體,可能使用ArgumentException

異常表示函數無法對給定參數進行操作,這是準確的。您不想返回null。如果你這樣做,那麼任何調用該函數的東西都必須檢查該值是否爲空。如果它是空的,那是什麼意思?或者代碼仍然會拋出異常,但現在這是一個令人費解的NullReferenceException。如果結果在被使用之前經過了一段時間,那麼異常可能不在功能附近,這使得它更容易混淆。但是,如果在使用無效參數調用該函數時引發異常,那麼可以更輕鬆地分辨出問題出在哪裏。

+0

我覺得值得把一些真正的重點放在一個不好的主意,它是拋出'異常'實例而不是某種派生類型。你基本上是在告訴客戶他們不能做任何事情(你怎麼知道的?),或者他們必須捕捉所有可能的異常,包括那些與傳遞無效參數完全無關的異常。 – kai

0

您必須返回一個int ?,然後在該分支中返回null。否則,你可以有一個參考參數&如果長度或寬度爲負

如果你絕對必須從這個方法&不想返回任何東西返回一個int不修改這個值,那麼唯一的選擇就是拋出未捕獲的異常。 ArgumentOutOfRangeException將是一個不錯的選擇

+0

這似乎是迄今爲止結構最好的答案。大多數人都有非常相似的方法,所以謝謝。我確實考慮過使用ref參數,但是我決定不這樣做,因爲我不想在執行方法時添加一個隨機區域變量。 –

+0

我必須不同意。空值通常是有問題的 - 你必須檢查空值的結果。如果您嘗試獲取高度或寬度無效的區域,則應該拋出異常。如果你調用一個函數來獲得一個區域,並且結果是「null」,那麼你對那個null做什麼? –

1

你可以拋出一個異常,並直接將其接住或在代碼中的其他點。這裏有一個很簡單的例子,我認爲這是一個很好的例子

一些例子: https://msdn.microsoft.com/en-us/library/87cdya3t(v=vs.110).aspx https://msdn.microsoft.com/en-us/library/ms173163.aspx

public static void randomCaller() 
{ 
    try { 
    int a = calculateArea(-1, 500); 
    } catch(NegativeDistanceNotPossibleException e) {} 
}   

public static int calculateArea(int width, int length){ 
      if(length < 0 || width < 0){ 
      //don't want to return anything as negative distance is impossible 
      //Execute my error handling here 
      throw new NegativeDistanceNotPossibleException("this is not possible"); 
      } 
      else{ 
      int area = length * width; 
      return area; 
      } 
     } 

public class NegativeDistanceNotPossibleException : Exception { 
    public NegativeDistanceNotPossibleException() {} 
    public NegativeDistanceNotPossibleException(string message) : base(message) {} 
    public NegativeDistanceNotPossibleException(string message, Exception inner) : base(message, inner) {} 
} 
0

如果你沒有想拋出異常,最好的辦法返回某個類或stucture,顯示操作的結果。例如:

public class OperationResult 
{ 
    public bool Success {get;set} 
    public string ErrorMessage {get;set} 
    public int Result {get;set} //use it if success true 
}  

,這樣你們可以處理錯誤的文字和事實,有些錯誤發生,否則,你可以使用操作結果

+0

一個類需要比int更多的內存分配,現在讓我們考慮一下編寫一個程序,該程序有數百萬個存儲類而不是整數。我總是試圖編寫面向性能和乾淨的代碼。所以拋出異常在我看來更好。 (你甚至可以在你的應用程序的一個地方很容易地記錄異常,甚至不必使用try,趕上它的工作並保持你的程序運行。) – mhenkel

+0

@mhenkel,如果你想獲得更好的性能,使用匯編程序或C++ ,C#用於商務應用程序,需要支持和乾淨的代碼。我的代碼邏輯更適合支持其他程序員,所以我的代碼比你更清潔。拋出異常也是困難的性能操作,比爲堆中的某些字節分配返回值更困難。如果你能避免拋出異常,避免它。我更喜歡在未處理的場景中使用異常,而不是業務邏輯。總結:錯誤執行流程取決於應用程序種類。 – MelnikovI

相關問題