2013-02-15 90 views
0

我使用的时候会遇到一些恼人的问题声称那里是可以得增强断言斯卡拉宏观

  • 没有良好的信息:它为什么失败,什么断言约为
  • 断言信息被埋在海量的不需要的信息之下,像太多的scala函数层。 我已经将这些问题留在了我的脑海中,现在新的scala宏已经可用了,我打算继续Stack Overflow并为每个问题创建一个高价值的问题和答案对。那样,下一个有这个问题的人就不必在这么多的错误信息中s舌。如果其他专家用他们自己的知识加以引申,我甚至可以更多地了解困扰我们的各种问题。

这是一个简单的scala宏示例。

回答

1

这里是一个溶液在约断言故障深度细节给予更多的和消除的内部功能的所有阶层抛出异常时:

def assert2(c: Context)(act: c.Expr[Any],exp: c.Expr[Any]): c.Expr[Unit] = { 
    import c.universe._ 
    val actm = act.tree.toString 
    val expm = exp.tree.toString 
    reify({ 
     if(act.splice!=exp.splice) { 
      try { 
       throw new Exception("AssertionError: "+c.Expr[String](Literal(Constant(actm))).splice+"["+act.splice+"]==["+exp.splice+"]"+c.Expr[String](Literal(Constant(expm))).splice) 
      } catch { 
      case unknown: Throwable => System.err.println(""+unknown+unknown.getStackTrace.toList.filter(_.toString.indexOf("scala.")!=0).mkString("\n ","\n ","\n ")); exit 
      } 
     } 
    }) 
} 
def myAssert2(act: Any, exp: Any) = macro assert2