4

一个不详尽的匹配,例如

def foo[A](t: Seq[A]) = t match {
    Seq(x) => x
}

通常(并非总是,但通常)是我的一个错误,会在运行时崩溃。Scala 发出警告,但在增量构建中,该文件可能已经编译,所以我会错过警告。

有没有办法,无论是全局的还是局部的,也许是通过注释,来强制 scala 将警告变成错误?

4

2 回答 2

4

可以提供一个自定义报告器,将警告任意报告为错误(或相反),但 API 当前是基于字符串的,因此它将过滤字符串消息而不是键入的警告。

没有针对特定警告失败的内置方法,但这-Xlint -Xfatal-warnings是升级警告的常用方法。

已请求禁止警告,但被认为是危险的。对于致命警告,要求是抑制被认为是良性的警告。

如果您有剩余的弃用,可以通过从弃用的方法调用它来抑制警告(在 -Xfatal-warnings 下会失败);如果该方法是本地的,则不会生成警告。

scala> @deprecated("","") def f = 8
f: Int

scala> f
<console>:9: warning: method f is deprecated: 
              f
              ^
scala> object A {
     | def a = {
     | @deprecated("","") def _f = f
     | _f
     | }}
defined object A

scala> A.a
res1: Int = 8

本地弃用技巧本身已被弃用,但您仍然可以使用转发伴侣:

scala> @deprecated("","") def f = 8
f: Int

scala> f
warning: there was one deprecation warning; re-run with -deprecation for details
res0: Int = 8

scala> @deprecated("","") class C { def g = f }; object C extends C
defined class C
defined object C

scala> C.g
res1: Int = 8
于 2013-07-06T19:36:04.120 回答
0

考虑询问有关您的构建过程的问题。

  1. 您应该在代码提交/签入之前立即进行完整、干净的构建(而不是增量)并运行单元测试。这是为了避免 SBT 或构建过程中的(潜在的、剩余的)错误。当然,您应该监控结果中的错误和警告。

  2. 你是否,或者你应该,做持续集成(自动的、预定的构建/测试)?在此期间,您可能拥有或引入对如何处理警告的一些控制(忽略或触发构建失败/警告)。

  3. 我看不到scalac从命令行执行此操作的方法。如果所有其他方法都不能满足您的需求,那么考虑作为最后的手段,并且只有在适合您的构建工具的情况下:为 . 创建一个包装脚本scalac,也命名为scalac

    • 调用真实的scalac
    • 监控输出:打印特定错误时返回错误,并且可能删除目标类文件[从错误语句中捕获]以进一步强制问题。
于 2013-07-06T02:46:33.273 回答