如何使用 sys.error(message) 避免堆栈跟踪

How to avoid stack trace with sys.error(message)

在一些自定义任务中,我检测到一些错误,我使用这种方式发出错误信号并停止处理当前任务:

sys.error("Some error")

它在内部抛出 RunTimeException。

SBT 显示堆栈跟踪,我想报告没有堆栈跟踪的错误。对于预期的错误,它通常是冗长的、没有意义的并且会使最终用户感到困惑。

从命令行 运行 时显示堆栈跟踪,而不是 shell,其中仅使用 last 命令显示堆栈跟踪。

是否有报告没有堆栈跟踪的错误的标准方法?

更新:

Asked 向 SBT 团队寻求更好的解决方案。

这样的事情应该可行,但它可能会隐藏您任务中其他类型的(无意的)错误?也许您可以将错误添加到错误任务中,然后在每次要引发错误时调用该任务?然后你可以只在错误任务上设置 traceLevel

lazy val myTask = taskKey[Unit]("doomed to err")

traceLevel in myTask:= -1

myTask := {
    error("Some error")
}

Is there a standard way of reporting errors with no stack trace?

还没有。但是有一种未记录的、不保证在未来工作的方式。

编辑:正如 Dale 所说 sbt.internal.util.MessageOnlyExceptionsbt.MessageOnlyException 的别名,因此我们可以使用以下内容:

lazy val doomed = taskKey[Unit]("doomed")

ThisBuild / organization := "com.example"
ThisBuild / scalaVersion := "2.12.7"
ThisBuild / version      := "0.1.0-SNAPSHOT"

lazy val root = (project in file("."))
  .settings(
    name := "msg-only",
    doomed := {
      throw new MessageOnlyException("boom!")
    }
  )

这不能保证在未来工作,因为它使用 sbt.internal,但基本上 MessageOnlyException 会按照我的想法去做。

sbt:msg-only> doomed
[error] boom!
[error] (doomed) boom!
[error] Total time: 0 s, completed Nov 28, 2018 12:42:47 PM