You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何部分编译器错误没有对应的错误代码?

为何部分编译器错误没有对应的错误代码?

这问题其实挺常见的,咱们拿几个Rust代码的实际例子来唠唠:


第一种:带错误代码的典型语义错误

先看这段代码,它会触发一个有明确错误代码的错误:

fn main() {
    let hi = foo;
}

对应的编译器错误输出:

error[E0425]: cannot find value `foo` in this scope
 --> src/main.rs:2:14
  |
2 |     let hi = foo;
  |              ^^^ not found in this scope

For more information about this error, try `rustc --explain E0425`.
error: could not compile `hei` (bin "hei") due to 1 previous error

这类错误属于语义分析阶段的问题,编译器已经完成了语法检查,在理解代码含义时发现了问题,所以会分配一个专属的错误代码,方便你查询详细解释。


第二种:无错误代码的语法早期错误

再看这段代码,它的错误就没有对应的错误代码:

fn main() {
    let 1_i32 << 32;
}

编译器输出:

error: expected a pattern, found an expression
 --> src/main.rs:2:5
  |
2 | let 1_i32 << 32;
  |     ^^^^^^^^^^^ arbitrary expressions are not allowed in patterns

error: could not compile `hei` (bin "hei") due to 1 previous error

这是因为这类错误属于早期语法检查阶段就被捕获的问题——编译器还没走到语义分析那一步,就发现代码违反了最基础的语法规则(比如let关键字后面必须跟模式,而不是表达式)。这类错误逻辑简单直接,不需要用错误代码来归类,开发者一眼就能看出是语法写错了。


第三种:来自Lint的非典型错误

如果咱们把上面代码里的let去掉,又会得到另一种不带错误代码的错误:

fn main() {
    1_i32 << 32;
}

对应的错误(部分内容):

error: this arithmetic operation will overflow

这类错误来自Rust的Lint检查,它不属于编译器核心的语法/语义错误,而是额外的代码合规性提示(比如这里的溢出风险)。Lint类的提示很多都不会分配错误代码,因为它们更偏向于代码质量建议,而非必须修复的编译错误(当然有些lint也可以被设为强制错误)。

总结一下:错误代码主要给那些语义层面、需要详细解释的编译错误;而早期语法错误、lint类提示,要么逻辑太直白,要么不属于核心编译错误,所以通常不会有对应的错误代码。

备注:内容来源于stack exchange,提问作者Slipper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 06:57:59