2016-09-15 105 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