在我使用Python编写代码时,经常会遇到一些异常,这时候如果没有任何代码来捕获这个异常,程序则会停止运行,并打印出回溯信息,也就是满屏的红色文本。那么代码崩溃的时候到底发生了什么呢?我们看个小例子numbers = [1, 2, 3]print(numbers[10])
回溯信息(Traceback):File "main.py", line 2, in <module>print(numbers[10])IndexError: list index out of range(列表索引越界)
这里包含三个信息,出错的文件和行号、导致错误的具体代码、错误类型以及出错原因。从下往上读回溯信息,最后一行是实际的错误,上面所有的内容都是python执行到错误处的路径。Try 和 Except 语句
将有风险的代码包裹在 try 代码块中。告诉 Python,如果在 except 代码块中出现问题,该执行什么操作。
numbers = [1, 2, 3]try: print(numbers[10])except IndexError: print("该索引在列表中不存在。")
输出:
该索引在列表中不存在。程序继续运行,没有崩溃,也没有红色文本。
Python 会尝试执行 try 内部的代码。如果出现 IndexError(索引错误),就会跳转到 except IndexError 代码块并执行其中的内容。如果没有出现错误,except 代码块会被完全跳过。
接下来我们看看常见的错误有哪些
# NameError(名称错误):使用了未定义的变量# print(username) # username 从未被定义过# TypeError(类型错误):操作的类型错误# result = "hello" + 5# ValueError(值错误):类型正确,但值无效# number = int("hello") # "hello" 无法转换为整数# IndexError(索引错误):索引越界items = [1, 2, 3]# print(items[99])# KeyError(键错误):字典中不存在该键data = {"name": "Alex"}# print(data["age"])# FileNotFoundError(文件未找到错误):文件不存在# open("missing.txt", "r")# ZeroDivisionError(除零错误):除以零# result = 10 / 0
这七种错误可能占了你未来几个月遇到的所有错误的 80%。当你遇到其中一种时,就知道问题属于哪一类了。
在实际执行中,我们经常会想知道出了什么问题,例如:try: number = int("not a number")except ValueError as e: print(f"出问题了:{e}")
出问题了:invalid literal for int() with base 10: 'not a number'(无效的字面量,无法以10为基数转换为整数:'not a number')
as e 会捕获错误对象。e 包含完整的错误信息。这对于记录问题或向用户显示具体错误非常有用。
在我们提供函数给别人使用时,为了能清楚的给出错误提示,这时候我们可以主动跑出错误,通过raise 来实现。总之,以上是对代码崩溃异常处理的一些内容,不妨动手敲敲代码来加深印象。