0

我在使用断言时遇到了一些烦人的问题

  • 没有可用的好信息:它为什么失败,以及断言是关于什么的
  • 断言信息被隐藏在不需要的信息的海洋中,比如太多层的 scala 函数。我一直把这些问题放在脑后,现在有了新的 scala 宏,我计划继续 Stack Overflow 并为每个问题创建一个高价值的问答对。这样一来,下一个遇到问题的人就不必费力地接受如此多的错误信息。如果其他专家用他们自己的知识发表意见,我什至可能会更多地了解困扰我们的各种问题。

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

4

1 回答 1

1

这是一个解决方案,提供了有关断言失败的更多详细信息,并在抛出异常时消除了所有内部函数的 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
于 2013-02-15T11:44:22.700 回答