2012-06-12 107 views
1

這是我第一次編寫一個庫(對於我在幾個遊戲中使用),所以我認爲對於良好的編程實踐,我應該直接評論我的代碼,添加XML摘要並使用異常處理這個庫的用戶在許多.NET類中做了一些錯誤(用戶可能是我或我的隊友)關於拋出和斷言的困惑

這是NoteRow類的構造函數(我正在開發音樂遊戲,需要)確定創建陣列的大小

bool[] l1NoteData; 
public NoteRow(int numberOfNotes) 
{ 
    this.l1NoteData = new bool[numberOfNotes]; 
} 

現在我有這種方法來切換l1NoteData數組上的布爾值。

public void toggleNote(uint index) 
{ 
    l1NoteData[index] = !l1NoteData[index] 
} 

所以這裏作爲防禦性編程我想檢查指數(這個類的用戶將指定,這是我或許我的隊友),超出了創建這個類或不是當指定的範圍。

我讀過很多拋出異常與斷言與返回布爾等,仍然困惑,不能選擇。這是我所關心的:

  • 我應該把「如果」語句來檢查,如果指數超過l1NoteData.length那麼火一個異常時,它是,明知異常時,該行以執行無論如何會閃光「超出範圍'索引? (IndexOutOfRangeException)如果是這樣,那麼拋出異常有什麼用?如果出現問題,會有一個默認的異常呢?
  • 我讀過Assert是給程序員的。要注意程序員,代碼不作爲程序員假定。與拋出用於處理異常測試用例(由用戶)的異常相比,我們永遠不能注入測試用例來使斷言觸發(如果它被觸發,那麼代碼是錯誤的)。現在這個圖書館的用戶將成爲我。所以我被認爲是程序員或用戶?我作爲這個類的用戶可能會調用toggleNote並且輸入索引超出了數組的限制,所以會拋出異常。或者我作爲一個程序員我的遊戲(這個庫是我的遊戲的一部分)應該放在那裏,所以我不會犯我的遊戲超出限制的索引toggleNote的錯誤。 (使用這個庫)我現在可以知道遊戲的代碼是錯誤的,因爲assert被解僱了,然後修復它,最終成爲發佈版本。 (然後斷言代碼將消失)
  • 從上面的問題,如果我徹底測試,我確信沒有更多的錯誤導致assert運行,然後進入發佈版本。我知道斷言不會在發佈版本的代碼中......但是這真的很好嗎?程序中可能存在更多的錯誤,所以現在當用戶體驗到這個錯誤時,斷言不會再出現。因此,當我可以使用異常而不是使用異常時,聲明真正好用的東西,如果用戶導致該異常觸發,我作爲開發人員可以接收該錯誤報告以修復它(但用戶是我和我的朋友)
  • 拋出異常比返回bool指示成功/失敗要好100%?你認爲哪個例子更適合返回bool?

對不起,我的混亂英語,因爲我已經在這個問題困惑......

回答

2

斷言只是用於測試。斷言不用於生產應用程序中的錯誤處理

您應該預先檢查(if)輸入是否來自用戶,預期會發生錯誤等。

如果錯誤是完全意想不到的,那麼這就是異常處理的目的。

如果你自己的程序提供了索引參數,那麼如果傳遞了錯誤的值,這是一個錯誤。例外情況很好。

一些很好的問題已經被問過這個

Are exceptions really for exceptional errors?

Debug.Assert vs Exceptions

Exceptions vs "if" in C#

1

問自己這個簡單的問題:你想阻止發生呢?

如果是,請檢查方法條目的索引並在無效時拋出異常。這是在方法調用中驗證參數的常用方法。

如果否,那麼你有一些選擇。

  • 您可以使用System.Diagnostics.DebugSystem.Diagnostics.Trace記錄無效的指數,並沒有做任何事情不返回。
  • 你可以忽略它,它會拋出一個IndexOutOfBoundsException無論如何。
  • 你可以防止它停止異常,但通常從方法返回。
2

通過預檢查(在函數頂部簡單if語句)拋出自己異常的最大原因是您可以指定自己非常詳細的異常消息。除了默認的「索引超出數組範圍」,或者不管它是什麼,你都可以明確地說「嘿,笨蛋,你試圖切換一個不存在的音符。」或者任何你想要的。

你自己的例外的其他情況是爲那些瀏覽你的庫代碼的人。您明確地檢查錯誤,並且任何瀏覽您的圖書館資源的人都會收到警報,發現這是一個潛在的錯誤。明確你想要在你的代碼中做什麼。

2

首先。通常認爲,在返回代碼之前的異常的一個好處是異常不能被忽略。這給你一個用例。如果您不希望使用庫的用戶(程序員)錯過重要的東西,請使用例外。其次。我認爲,你不應該在程序員和用戶中使用圖書館的一般情況下的斷言。我的意思是你應該在使用你的庫的代碼中使用斷言來檢查你的假設是否正確。