【问题标题】:How to avoid stack trace with sys.error(message)如何使用 sys.error(message) 避免堆栈跟踪
【发布时间】:2018-12-05 11:54:44
【问题描述】:

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

sys.error("Some error")

它在内部抛出一个 RunTimeException。

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

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

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

更新

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

【问题讨论】:

    标签: sbt


    【解决方案1】:

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

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

    编辑:正如 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
    

    【讨论】:

    • 它是sbt包中的类型别名,所以是安全的。
    【解决方案2】:

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

    lazy val myTask = taskKey[Unit]("doomed to err")
    
    traceLevel in myTask:= -1
    
    myTask := {
        error("Some error")
    }
    

    【讨论】:

    • 是的,正如您所说,带有良好错误消息的预期错误和意外错误(堆栈跟踪很有趣)之间没有区别。感谢traceLevel 的技巧。
    猜你喜欢
    • 2015-11-14
    • 2011-07-02
    • 2014-04-17
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    相关资源
    最近更新 更多