Birini kullanarak Scala kod hataları işlemek için
3* *monad bir şey ya hiç Scala şeyler ile başa çıkmak için büyük anlamlı bir yoldur. Ama eğer bir mesaj günlüğü gerekiyorsa zaman "hiçbir şey" oluşur? Scala API belgelerine göre
Ya da yazın sık olarak kullanılır alternatif scala için.Seçeneği nerede Sol başarısızlık (kongre tarafından) ve temsil Doğru Biraz benzer.
Ancak, en iyi uygulamalar, ya da gerçek dünya Da güzel örnek işleme hataları Da içeren kullanarak bulmak için şans vardı. Sonunda kendi projem için şu kodu buldum:
def logs: Array[String] = {
def props: Option[Map[String, Any]] = configAdmin.map{ ca =>
val config = ca.getConfiguration(PID, null)
config.properties getOrElse immutable.Map.empty
}
def checkType(any: Any): Option[Array[String]] = any match {
case a: Array[String] => Some(a)
case _ => None
}
def lookup: Either[(Symbol, String), Array[String]] =
for {val properties <- props.toRight('warning -> "ConfigurationAdmin service not bound").right
val logsParam <- properties.get("logs").toRight('debug -> "'logs' not defined in the configuration").right
val array <- checkType(logsParam).toRight('warning -> "unknown type of 'logs' confguration parameter").right}
yield array
lookup.fold(failure => { failure match {
case ('warning, msg) => log(LogService.WARNING, msg)
case ('debug, msg) => log(LogService.DEBUG, msg)
case _ =>
}; new Array[String](0) }, success => success)
}
(Lütfen bu gerçek bir projeden bir parçacık olduğunu unutmayın, kendi derleme değil yani)
Yukarıdaki kodu yeniden düzenleme Kodu ve/Either
veya daha iyi fikirler nasıl kullandığınızı bilmek minnettar olurum.
CEVAP
Ya da en az iki anlamlı sonuçlardan biri, tek anlamlı bir sonuca dönmek için kullanılan ya da hiç Seçenek tersine döndürmek için kullanılır.
Kolay bir örnek aşağıda verilmiştir anlamak (Scala posta listesinde bir süre önce üzerinde dolaşan):
def throwableToLeft[T](block: => T): Either[java.lang.Throwable, T] =
try {
Right(block)
} catch {
case ex => Left(ex)
}
İşlev adı "" başarılı "(<^ sonuç . Doğru döndürür blok yürütme eğer anlaşılacağı gibi )". Eğer bir Throwable atılır aksi takdirde, "(<^ throwable . Sola döndürür )". Desen eşleştirme sonucu işlemek için kullanın:
var s = "hello"
throwableToLeft { s.toUpperCase } match {
case Right(s) => println(s)
case Left(e) => e.printStackTrace
}
// prints "HELLO"
s = null
throwableToLeft { s.toUpperCase } match {
case Right(s) => println(s)
case Left(e) => e.printStackTrace
}
// prints NullPointerException stack trace
Bu yardımcı olur umarım.
Java kullanarak.net.Ateş ve işlemek iç...
Nasıl düğmeye tıklama Parçaları içinde...
Hataları CUDA çalışma zamanı API kulla...
Nasıl dava sınıfı scala bir Numaraland...
Nasıl bir tarayıcı aslında bazı metin ...