如何使用 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.MessageOnlyException
是 sbt.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
在一些自定义任务中,我检测到一些错误,我使用这种方式发出错误信号并停止处理当前任务:
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.MessageOnlyException
是 sbt.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