2016-09-15 43 views
0

Apache有IOUtils.closeQuietly(Closeable)。在Scala中,我想概括一下:執行一個塊並插入異常,同時記錄它們。這樣的事情:,執行一個塊並忽略但記錄異常

import LogUtils._ 

object Playground extends App { 
    implicit val logger_ = LoggerFactory.getLogger(getClass) 
    silentLog { 
    println("block") 
    throw new Exception("an exception") 
    } 
    println("end") 
} 


import org.slf4j.{Logger, LoggerFactory} 
import scala.util.control.NonFatal 

object LogUtils { 
    def silentLog[U](f: => U)(implicit log: Logger) { 
    try f 
    catch { 
     case NonFatal(e) => log.error(null, e) 
    } 
    } 
} 

這是否已經在一些常用的庫中實現?

+2

我想不會,因爲通常不是一個好的做法 – cchantep

回答

0

Try[T]在某種程度上會做到這一點,但不會記錄異常。 Try確實try .. catch ...

def LoggingTry[T](f: => T)(implicit logger: Logger): Try[T] = Try(f()).recoverWith { 
    case th => 
    logger.log(th) 
    Try { throw th } 
} 

使用getOrElse(())如果你想在失敗的情況下獲得成功,默認值(單位)的情況下,價值

+0

我不t認爲這是* OP *想要的。最終,你再次拋出並將其包裝到'Try'中,該處理必須在某個時刻處理,最好是模式匹配或扁平化。 – sebszyller

+0

@sebszyller如果你不想要模式匹配,即使在'silentLog'的情況下,'getOrElse' – pamu

+0

@sebszyller的返回類型將是'Any',所以你必須在某種時間或其他模式匹配 – pamu