常见错误类型:认识你的"死对头"
打仗要知己知彼。报错也一样——你得认识这些错误长什么样、在什么场景下出现,才能快速定位问题。这一节我们把 Python 和 JS 里最常见的错误类型都过一遍,就像翻花名册一样。
Python 常见错误
加载代码编辑器中……
JavaScript 常见错误
加载代码编辑器中……
踩坑提醒
JS 的"沉默"是一把双刃剑。 Python 访问不存在的字典键会立刻 KeyError,访问越界的列表会立刻 IndexError——程序立刻告诉你"这里有问题"。
JS 却默默返回 undefined,程序继续跑,直到很远的地方才出一个莫名其妙的 bug。这就像你鞋里有颗石子,Python 立刻喊疼让你处理,JS 忍着不说,走了三公里后脚磨破了。
建议:在 JS 里多做"提前检查"(if 判断),不要完全依赖 try/catch。
错误类型对照表
两种语言的错误类型并非一一对应,但这张表可以帮你建立大致的映射:
| 场景 | Python | JavaScript |
|---|---|---|
| 变量不存在 | NameError | ReferenceError |
| 类型不匹配 | TypeError | TypeError |
| 值无效 | ValueError | 通常不报错,或 TypeError |
| 字典/对象键不存在 | KeyError | 返回 undefined(不报错) |
| 索引越界 | IndexError | 返回 undefined(不报错) |
| 属性不存在 | AttributeError | 返回 undefined(不报错) |
| 对 null 操作 | AttributeError | TypeError |
| 数值越界 | OverflowError | RangeError |
| 语法错误 | SyntaxError | SyntaxError |
简单记忆:Python 报错多且早,JS 报错少且晚。Python 是严厉的老师当场指出你的错误,JS 是宽容的老师让你自己发现问题。
自定义错误
内置的错误类型不够用?自己造一个!
加载代码编辑器中……
自定义错误的好处:
- 语义更清晰——
InsufficientFundsError比ValueError("余额不足")更一目了然 - 可以携带额外数据——上面的例子里错误对象携带了
balance和amount - 方便分类处理——可以用
except InsufficientFundsError或instanceof精确捕获
| Python | JavaScript | |
|---|---|---|
| 继承自 | Exception | Error |
| 构造函数 | __init__(self, ...) | constructor(...) |
| 调用父类 | super().__init__(msg) | super(msg) |
| 错误名称 | 自动是类名 | 需手动设 this.name |
🏋️AI 练习
创建一个自定义错误类 InvalidEmailError,用于验证邮箱格式。要求:
- 继承
Exception(Python)/Error(JS) - 存储错误的邮箱地址作为属性
- 写一个
validateEmail(email)函数,检查邮箱是否包含@和.,不合格就抛出你的自定义错误
测试输入:
"alice@example.com" → 通过
"not-an-email" → 抛出 InvalidEmailError
"@missing-name.com" → 抛出 InvalidEmailError
提示:不需要写完美的邮箱验证(那是一个出了名的复杂问题),简单检查就行。
错误也是数据
最后一个重要观念:错误不是洪水猛兽,它只是一种特殊的数据。就像函数可以返回数字、字符串,它也可以"返回"一个错误——只不过是通过 raise / throw 这种特殊通道。
理解了这一点,你就不会害怕错误了。错误信息在告诉你:哪里出了什么问题。它是你的朋友,不是敌人。
小结
| 概念 | Python | JavaScript |
|---|---|---|
| 最常见的错误 | TypeError, ValueError, KeyError | TypeError, ReferenceError |
| 访问不存在的键/属性 | 立刻报错 | 返回 undefined |
| 自定义错误 | class MyError(Exception) | class MyError extends Error |
| 错误报告风格 | 严格:有问题就报 | 宽容:能不报就不报 |