2016-08-12 21 views
0

我正在寫一個程序來讀取連接到我的汽車的藍牙OBDII加密狗的數據。我有一個OBDII助手類負責獲取特定的車輛數據。我寫的所有方法都返回一個可爲空的類型;我的想法是,當我使用這個類時,我可以通過檢查null來處理錯誤。這裏有兩個樣本:錯誤返回可爲null的類型是不好的做法嗎?

private byte?[] getPIDData(string pid) 
    { 
     string data = sendMessage(pid); 
     string[] bytes = data.Split(' '); 
     try 
     { 
      byte?[] convertedData = new byte?[bytes.Length - 2]; 
      for(int i = 2; i < bytes.Length; i++) 
      { 
       convertedData[i - 2] = Convert.ToByte(bytes[i], 16); 
      } 
      return convertedData; 
     } 
     catch(FormatException) 
     { 
      return null; 
     } 
    } 

public double? GetEngineLoad() 
    { 
     byte?[] data = getPIDData("0104"); 
     if (data == null) 
      return null; 
     return (100.0/255.0) * (double)(data[0]); 
    } 

這是不好的做法/有沒有更好的方式消耗這些方法時,指示錯誤?

+2

爲什麼要通過檢查null來處理錯誤?只是拋出(或不捕捉)例外。然後你的消費者實際上得到一個*特定的*錯誤類型,消息和堆棧跟蹤。 – Blorgbeard

+0

如何檢查空「處理錯誤」?它沒有告訴你有關錯誤的任何信息。 – David

+0

我想處理錯誤是不正確的術語。我將成爲唯一一個使用這個類的人,所以我主要將使用空返回值作爲出錯的指示。然而,儘管我知道我是唯一一個正在上課的人,但我還是願意按照「本書」的方式去做,以便將來可以參考。 –

回答

0

雖然返回可爲空的類型通常不是一個壞習慣,但它絕對不是報告錯誤的合適技術。使用API​​的圖層可能會捕獲異常,並使用默認值,記錄錯誤等。

如果您的代碼路徑拋出錯誤,則使用API​​的代碼應該處理它。通過返回null掩蓋錯誤導致難以維護的代碼,因爲異常情況不被注意。

另一種方法是報告而不是拋出一個異常狀態的API使用輸出參數:

private bool TryGetPIDData(string pid, out byte[] res) { 
    if (... success) { 
     res = newValue; 
     return true; 
    } else { 
     res = null; 
     return false; 
    } 
} 
0

他們是那種不得已的。一個字節數組本身是空的,所以你可以返回byte []。另外,字節?[]沒有做你認爲的事情。字節?[]是一個可爲空字節的數組,而不是一個可爲空的字節數組。

對於雙數,這可能是允許的。很多try-parse樣式方法爲最終數據使用out參數,而函數的實際返回值是成功的布爾值。

如果通常不會出現錯誤,那麼我只會讓異常被拋出或捕獲它,併爲您的API拋出特定的異常。

而且(100/255)始終爲0。

+0

關於'TryParse'的事情是,結果並不表示一個異常,例如,*例外情況。未能解析該值是該方法的正常和預期結果。如果你的內存用完了,就像你調用TryParse一樣,它可能會引發OutOfMemoryException - 它不會返回false。 – Blorgbeard

0

如果你是唯一一個寫作和消費的所有代碼,你知道你在做什麼,然後它的確定,因爲沒有其他人以適應你的編程風格.....但我永遠不會這樣做,特別是在與其他程序員一起工作時。

忘記檢查null太容易了。空值不應該表明存在問題,那就是拋出異常的原因。空不會強制停止執行代碼而不是在catch塊中,並且實際上並不表示有什麼錯誤,它們只是顯示數據不存在。如果您必須確定問題是空值,請不要將堆棧跟蹤打包以顯示問題源於何處。

C#是爲例外而設計的,表示存在問題。你能以另一種方式處理嗎?當然,但你正在做更多的工作來獲得相同或更少的利益。唯一一次我會考慮不使用異常的情況是,我必須絕對確保沒有任何異常是未被捕獲的。老實說,即使這樣,我會考慮採取與使用空值表示錯誤不同的方法。這太容易出錯,而且容易犯錯誤。

相關問題