参与 Scala 的 OSS 生态系统

错误报告指南

语言

Scala 编译器和标准库错误跟踪器位于 https://github.com/scala/bug,对于 Scala 3,它位于 github.com/scala/scala3。在提交错误之前,请按照 是否是错误? 中的说明确保它确实是一个错误。

是否是错误?

识别错误的第一步是识别 Scala 发行版中受影响的组件。首先,确保您的问题属于以下任何类别

  • 错误通常表现为运行时异常,或作为 Scala 标准库方法的意外/不直观行为。
  • 编译器错误表现为编译时异常、运行时代码的意外行为或类型系统的无效行为。
  • 反射是出现在 scala.reflect 包中的错误。对于反射错误,与错误应用相同的规则。
  • Scaladoc 错误表现为其呈现的信息中的逻辑问题(即,显示的信息不正确,例如不正确的子类化关系)或用户界面的不正确行为。如果您想建议更改文档内容,请提交拉取请求(可以使用 GitHub 在浏览器中完成,这比提交错误更简单、更快速)。仅当您无法提供修复建议时,才针对文档内容提交错误。

如果您的问题与以下任何外部项目相关,请务必使用其相应的错误跟踪器

以下通常被认为是错误

  • Scala 编译器崩溃如果 Scala 编译器因内部错误(编译时异常)而崩溃,您肯定找到了一个错误,可以继续本文档的下一部分报告已确认的错误。
  • 回归如果某个代码段在之前的 Scala 版本中有效,但现在不再编译或导致异常,则可能是回归。
  • 验证错误发生在将已编译的 Scala 程序加载到 Java 虚拟机时。如果您收到验证错误,通常表示您找到了一个错误。在报告新问题之前,请先确保您的项目没有使用过时的 .class 文件。

如果您有一个代码段导致您认为行为不正确的字节码,您可能找到了一个错误,也可能没有。在报告您的问题之前,请尝试以下操作

  • 确保您最小化您的问题。要正确最小化问题,请遵循以下说明

    1. 逐步从原始失败代码段中删除部分,直到您认为您拥有问题的最简单表示形式。

    2. 确保您已将代码段与可能导致不正确行为的任何库分离。实现此目的的一种方法是尝试在隔离的环境中重新编译有问题的代码段,而不考虑任何复杂的构建环境。如果您的代码依赖于一些严格的 Java 库并且有可用的源代码,请确保后者也已最小化。

    3. 确保您从一个干净的状态编译您的项目。您的问题可能与单独编译相关,在没有使用新 .class 文件进行干净构建的情况下很难检测到。

    4. 如果您在 IDE 中构建代码时遇到错误,请在命令行中重现该错误。相同的规则适用于 sbtMill 等构建工具。

    5. 如果您想在问题跟踪器中提交改进,请先在某个邮件列表中讨论。它们提供的受众比问题跟踪器大得多。后者不适合进行长时间的讨论。

  • 请记住,您所看到的行为可能是故意的。用于验证语言行为是否故意的良好正式资源可以在 Scala 改进提案文档Scala 语言规范 中找到。如果您有疑问,您始终可以在 社区类别Stack Overflow 上提问。

一般来说,如果您发现自己卡在其中任何一个步骤中,在 Scala 贡献者 上提问可能会有帮助

  • 对于意外行为,请使用 社区类别
  • 对于编译器错误,请使用 编译器类别

  • 编译器报告的异常示例,通常不是错误
    1. StackOverflowError 通常不是错误,除非堆栈跟踪涉及编译器的内部包(如 scala.tools.nsc...dotty.tools.dotc...)。尝试增加 Java 堆栈大小 (-Xss),在大多数情况下,这会有所帮助。
    2. AbstractMethodError 可能发生在您没有重新编译所有必需的 Scala 文件(构建工具,如 sbt,可以防止这种情况发生)或您正在混合为不同 Scala 版本编译的外部库(例如,一个使用 2.10.x 而另一个使用 2.11.x)时。

报告错误前请检查

在报告错误之前,请务必检查问题跟踪器中是否有其他类似错误。异常名称或编译器阶段是搜索的最佳关键字。如果您遇到意外行为,请搜索发生该行为的方法/类名称。您的问题可能已经报告,并且可能已经提供了可供您利用的解决方法。如果您的问题报告,请务必添加您的测试用例作为评论,如果它与任何现有测试用例不同的话。

注意:报告已存在的错误会给您、Scala 团队以及所有搜索问题数据库的人带来额外的开销。为避免这种不便,请务必彻底搜索现有问题。

如果您在问题跟踪器中找不到您的问题,请创建一个新的错误。有关创建错误报告的详细信息,请参见以下部分。

创建错误报告

请务必尽可能填写更多字段。请确保您已注明以下内容

  1. 您正在使用的确切 Scala 版本。例如,2.13.133.3.2。如果错误发生在多个版本中,请注明所有版本。
  2. 受错误影响的组件。例如,标准库、Scaladoc 等。
  3. 与您的问题相关的标签。例如,如果您认为您的问题与类型检查器相关,并且您已成功最小化您的问题,请将您的错误标记为“类型检查器”和“已最小化”。问题跟踪器会在您键入时建议现有标签的名称,因此请尝试不要创建重复项。
  4. 运行环境。您是在 Linux 上运行吗?Windows?您正在使用哪个 JVM 版本?

为了让我们快速对您发现的错误进行分类,生成所观察到的问题的代码片段尽可能最小化非常重要。有关最小化代码片段的建议,请参阅上述内容的相应小节 (是否为错误?)。

说明

在您的问题说明中,请尽可能详细。包含以下信息的错误报告通常可以被理解、分类并非常快速地修复

  1. 包括一个测试用例(如果可能,最小化),使我们能够重现问题行为。在格式正确的代码块中包括您的测试用例(和输出)
    ```scala
    List(1, 2, 3).map(x => x + 1)
    ```
    
  2. 预期的输出。
  3. 实际输出,包括堆栈跟踪。
  4. 如果适用,在邮件列表上的相关讨论。
  5. 如果您已经研究过该问题,请提供有关修复该问题的有趣见解或建议。

此页面的贡献者