跳到主要内容

常见错误类型:认识你的"死对头"

打仗要知己知彼。报错也一样——你得认识这些错误长什么样、在什么场景下出现,才能快速定位问题。这一节我们把 Python 和 JS 里最常见的错误类型都过一遍,就像翻花名册一样。

Python 常见错误

加载代码编辑器中……

JavaScript 常见错误

加载代码编辑器中……
踩坑提醒

JS 的"沉默"是一把双刃剑。 Python 访问不存在的字典键会立刻 KeyError,访问越界的列表会立刻 IndexError——程序立刻告诉你"这里有问题"。

JS 却默默返回 undefined,程序继续跑,直到很远的地方才出一个莫名其妙的 bug。这就像你鞋里有颗石子,Python 立刻喊疼让你处理,JS 忍着不说,走了三公里后脚磨破了。

建议:在 JS 里多做"提前检查"(if 判断),不要完全依赖 try/catch。

错误类型对照表

两种语言的错误类型并非一一对应,但这张表可以帮你建立大致的映射:

场景PythonJavaScript
变量不存在NameErrorReferenceError
类型不匹配TypeErrorTypeError
值无效ValueError通常不报错,或 TypeError
字典/对象键不存在KeyError返回 undefined(不报错)
索引越界IndexError返回 undefined(不报错)
属性不存在AttributeError返回 undefined(不报错)
对 null 操作AttributeErrorTypeError
数值越界OverflowErrorRangeError
语法错误SyntaxErrorSyntaxError

简单记忆:Python 报错多且早,JS 报错少且晚。Python 是严厉的老师当场指出你的错误,JS 是宽容的老师让你自己发现问题。

自定义错误

内置的错误类型不够用?自己造一个!

加载代码编辑器中……

自定义错误的好处:

  1. 语义更清晰——InsufficientFundsErrorValueError("余额不足") 更一目了然
  2. 可以携带额外数据——上面的例子里错误对象携带了 balanceamount
  3. 方便分类处理——可以用 except InsufficientFundsErrorinstanceof 精确捕获
PythonJavaScript
继承自ExceptionError
构造函数__init__(self, ...)constructor(...)
调用父类super().__init__(msg)super(msg)
错误名称自动是类名需手动设 this.name
🏋️AI 练习

创建一个自定义错误类 InvalidEmailError,用于验证邮箱格式。要求:

  1. 继承 Exception(Python)/ Error(JS)
  2. 存储错误的邮箱地址作为属性
  3. 写一个 validateEmail(email) 函数,检查邮箱是否包含 @.,不合格就抛出你的自定义错误

测试输入:

"alice@example.com"   → 通过
"not-an-email" → 抛出 InvalidEmailError
"@missing-name.com" → 抛出 InvalidEmailError

提示:不需要写完美的邮箱验证(那是一个出了名的复杂问题),简单检查就行。

错误也是数据

最后一个重要观念:错误不是洪水猛兽,它只是一种特殊的数据。就像函数可以返回数字、字符串,它也可以"返回"一个错误——只不过是通过 raise / throw 这种特殊通道。

理解了这一点,你就不会害怕错误了。错误信息在告诉你:哪里出了什么问题。它是你的朋友,不是敌人。

小结

概念PythonJavaScript
最常见的错误TypeError, ValueError, KeyErrorTypeError, ReferenceError
访问不存在的键/属性立刻报错返回 undefined
自定义错误class MyError(Exception)class MyError extends Error
错误报告风格严格:有问题就报宽容:能不报就不报