2.1 创建异常
打不过就加入。如果我们不能避免程序中出现错误,我们就要学会控制它们。为此,让我们学会有意识地创建异常吧。
最简单的异常例子是 除以零。然后程序也是简单的:
x = 100 / 0
这样的代码会执行出错:
Traceback (most recent call last):
File "", line 1, in
x = 100 / 0
~~~^~
ZeroDivisionError: division by zero
ZeroDivisionError
是异常的名字,而 division by zero
是它的简短描述。同时,Python还会告诉你异常发生的代码行。
数据类型不匹配
当然,还有其他可能的异常。例如,尝试将字符串和数字相加时:
s = "100" + 100
会发生 TypeError
异常:
Traceback (most recent call last):
File "", line 1, in
TypeError: unsupported operand type(s) for +: 'str' and 'int'
超出列表边界
另一个非常常见的错误是尝试访问列表中不存在的元素,这会生成异常:
my_list = [1, 2, 3]
print(my_list[10])
这会导致 IndexError
异常:
Traceback (most recent call last):
print(my_list[10])
~~~~~~~^^^^
IndexError: list index out of range
这样的异常有多少呢?有成千上万种不同类型的异常。而且,如果现有的异常不足以描述某种特定情况,你还可以自己创建。虽然最常见的异常并没有那么多。
2.2 常见异常列表
异常很多,但对你这样的初学者来说,了解最常见的异常会很有帮助。下面是一个表格:
异常 | 描述 |
---|---|
Exception |
所有异常的基类。 |
IndexError |
当尝试访问不存在的序列(如列表或元组)的索引时,出现此异常。 |
KeyError |
当尝试访问字典中不存在的键时,出现此异常。 |
NameError |
当尝试访问未声明的变量时,出现此异常。 |
RuntimeError |
发生与其他异常类型不相关的常规运行时错误时,出现此异常。 |
StopIteration |
用于指示迭代结束的异常。 |
SyntaxError |
当代码中有语法错误时,出现此异常。 |
IndentationError |
当代码缩进错误时出现此异常(SyntaxError 的子类型)。 |
TabError |
当混合使用制表符和空格进行缩进时,出现此异常(IndentationError 的子类型)。
|
TypeError |
当尝试执行与数据类型不兼容的操作时,出现此异常。 |
UnboundLocalError |
当在声明之前引用局部变量时,出现此异常(NameError 的子类型)。
|
ValueError |
当向函数或操作传递具有错误值的参数时,出现此异常。 |
ZeroDivisionError |
当执行除以零的操作时,出现此异常。 |
很可能,你作为新手在学习的第一个月里会遇到所有这些错误。这没什么不好的——只有通过错误才能学到东西。
2.3 代码中的错误
让我们再分析几个代码中出现错误的情况,这样你以后在代码中更容易找到它们:
IndentationError
当代码中的缩进不正确时,会出现这种类型的错误。例如,混用制表符和空格或缩进量不正确。
def example():
print("Hello")
print("World") # 错误的缩进会导致 IndentationError
example()
NameError
def example():
print(undeclared_variable) # 尝试使用未声明的变量会导致 NameError
example()
ValueError
当操作或函数接收到一个具有正确类型但不合适值的参数时,会出现这种类型的错误。
def example():
int("abc") # 尝试转换非数字字符串会导致 ValueError
example()
KeyError
当程序尝试访问字典中不存在的键时,会出现这种类型的错误。
def example():
my_dict = {"a": 1, "b": 2}
print(my_dict["c"]) # 尝试访问不存在的键会导致 KeyError
example()
SyntaxError
当代码中存在语法错误,即代码不符合 Python 语言语法时,会出现这种类型的错误。
def example():
eval("if True print('Hello')") # 错误语法会导致 SyntaxError
example()
预知即预防。现在你可以识别和创建导致错误的情况。是时候学习如何处理这些错误了。
GO TO FULL VERSION