我在使用断言时遇到了一些烦人的问题
- 没有可用的好信息:它为什么失败,以及断言是关于什么的
- 断言信息被隐藏在不需要的信息的海洋中,比如太多层的 scala 函数。我一直把这些问题放在脑后,现在有了新的 scala 宏,我计划继续 Stack Overflow 并为每个问题创建一个高价值的问答对。这样一来,下一个遇到问题的人就不必费力地接受如此多的错误信息。如果其他专家用他们自己的知识发表意见,我什至可能会更多地了解困扰我们的各种问题。
这是一个简单的 scala 宏示例。
我在使用断言时遇到了一些烦人的问题
这是一个简单的 scala 宏示例。
这是一个解决方案,提供了有关断言失败的更多详细信息,并在抛出异常时消除了所有内部函数的 scala 层:
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