2015-09-09 32 views
0

比方說,我有一個方法需要List並找到一個基於id的元素。可能是這個元素可能不存在!在這種情況下應該做什麼?我們應該拋出一個Exception還是處理Option類型?拋出異常或更好地返回選項「按ID查找」方法?

def myMethod(entries: List[MyType], id: Long): MyType = { 
    val result = entries.collect { case entry if entry.id == id => entry } 
    assert(...check if result is not empty....) 
    result.head 
} 

我的觀點是,聲明assert(....),我明確強制調用者必須處理的IllegalStateException。這是一個很好的做法嗎?或者我應該返回一個Option[MyType]並讓調用者處理這種情況?你們有什麼感想?

+1

我想 「看來爲基礎」,並且通過框架/庫變化。也就是說,返回Option通常會在Scala中產生更多的慣用可組合性。另一方面,考慮它們不是相互排斥的(比如,「First」和「FirstOrDefault」)。 – user2864740

+1

在FP世界中,不鼓勵拋出異常,這是一種副作用。但是,如果您考慮某個列表缺少一些標識爲「例外」(由於代碼或配置錯誤)的情況,請使用它。 – Tyth

回答

2

使用編程語言的標準模式。

在斯卡拉,通常使用TryOption而不是拋出異常。 也可以使用已經與您描述的方法find一起使用的豐富的標準庫。

慣用階

scala> List(1,2,3).find(_ == 5) 
//res0: Option[Int] = None 

scala> List(1,2,3).find(_ == 2) 
res1: Option[Int] = Some(2) 

與異常實施例包裹在Try

// needed to make sure that MyType has an method `id` 
trait MyType { def id : Long } 


def myFindWithException[A <: MyType](entries: List[A], id: Long): Try[A] = Try{ 
    entries 
    .find(_.id == id) 
    .getOrElse(throw new Exception("Your Text here")) 
} 
1

我不認爲這是一個元素不出現在List真的例外,所以在這種情況下,我會去返回Option
如果您認爲調用myMethod(list, id)時存在list中存在相應ID的元素,則可以拋出Exception

+0

這絕對不是前提條件,因爲它可以被看到!即使我不同意這個斷言(...),因爲它只是給這個方法的調用者留下一個未經檢查的異常! – sparkr