我只想知道你在哪裏定義,拋出和捕獲異常以及看看是否有共識關於做考慮。設計異常,使用和定義
讓我來說一個基於的例子。 讓我說我有解決方案,並在該解決方案,我有2個項目:DomainProject
和ControllerProject
。
在DomainProject我有做一些查詢例如在
RepositoryClass
存儲庫我的方法:GetObjectById(int id) { ... }
而且我有一些例外情況在這個項目像
ObjectNotFoundException
定義。在
ControllerProject
我想查詢我的倉庫,所以我做的東西,看起來像:MyObject obj = repo.GetObjectById(11);
現在的問題是,如果ID的確存在誰應該檢查的照顧。如果你選擇的是ControllerProject應檢查ID的存在,你可以用一些這樣的代碼結束:
MyObject obj = repo.GetObjectById(11);
if (obj == null) {throw new ObjectNotFoundException();}
但是那不好的一面是,它往往是重複的遍在的地方GetObjectById
用來。當然,在某些情況下,如果你得到一個空值,你不會在意,所以它不會直接在DomainProject中拋出異常。但我首先不喜歡重複if測試,其次,更多與我的問題有關,我不喜歡在當前項目之外使用異常定義。
我有這樣的感覺,一個異常只應該扔在項目中,它是定義和其他項目應該只抓住他們。
回到我的例子,我將如何解決這種情況。那麼一個簡單的想法是在我的域項目中定義2方法。一個拋出異常,另一個拋出異常。唯一不確定的是我必須使用哪種命名約定:GetObjectByIdThrowsIfNotFound()
和GetObjectById()
。或者,我可以添加一個可選參數GetObjectById(int id, bool isExceptionThrow = true)
。
您如何看待異常?
感謝
試試..似乎是一個很好的建立模式謝謝你的答案。但是,而不是一個out對象的值,我寧願有一個lambda,它只會在沒有找到對象時調用。 – mathk 2012-04-19 16:15:38
@mathk:我認爲自己是lambdas的一個*大*粉絲 - 我使用Autofac! - 但有趣的是,似乎爲了lambda而使用lambda表達式。另一個例子可能會影響我,但是'if(TryGetX(id,out val)){yes ...;} else {no ...;}'比'var val = GetXElse(id,()= > {no ...;});如果(???){yes ...;}',甚至將後者中的內容擱置一邊if(???)'。但是,如果你喜歡它,那麼基本的觀點仍然存在:如果'null'返回不明確,你只需要變體。如果你不需要它們,包括它們會混淆你的意圖。 – 2012-04-19 16:38:38