我需要定義一個提供上下文信息的Exception
...並且此信息存儲在Map
中。爲了避免錯鍵的名字,我已經定義了以下Enumeration
:Scala:異常模式匹配
object ContextValueName extends Enumeration {
type ContextValueName = Value
val Value1 = Value("Value1")
val Value2 = Value("Value2")
val ValueN = Value("ValueN")
implicit def toString(name: ContextValueName) = name.toString
}
這是Exception
代碼:
import ContextValueName._
trait MyException extends RuntimeException {
val errorCode: Int
val contextValues: Map[ContextValueName, Option[String]]
}
object MyException {
def apply(
message: String, _errorCode: Int, _contextValues: Map[ContextValueName, Option[String]]
): MyException = new RuntimeException(message) with MyException {
val errorCode: Int = _errorCode
val contextValues: Map[ContextValueName, Option[String]] = _contextValues.withDefault(_ => None)
}
def unapply(exception: MyException) = {
if (exception eq null) None
else Some((
exception.errorCode,
exception.contextValues
))
}
}
最後這裏是我如何處理MyException
類型的異常:
callService("myService").map { result =>
...
}.recover {
case [email protected](1, contextValues) =>
Logger.debug(s"error invoking myService: ${contextValues(Value1).get}")
case NonFatal(e) =>
Logger.error(s"unhandled error: ${e.getMessage}")
}
問題是,即使拋出的異常像一樣,第一個case
語句也不會執行,執行總是落在最後的case
聲明中。我錯過了什麼嗎?
不相關(我希望),但隱式調用toString是一個不必要的重載。也許把它稱爲'在反引號中串'。 – 2014-09-11 00:57:18