Python异常是在程序执行时发生的错误,可能会导致程序终止运行。
在Python中,异常处理是一种机制,它允许开发人员在程序发生异常时捕获、处理和报告这些异常,以便程序可以继续运行或在出现异常时进行优雅的退出。
在Python中,异常可以是标准异常(例如SyntaxError和TypeError)或自定义异常。标准异常是由Python内部定义的,而自定义异常是由开发人员定义的,通常用于特定的应用程序或库。
以下是一些常见的Python异常:
- SyntaxError:语法错误,通常是由于语法错误导致的,如缺少括号、冒号等。
- TypeError:类型错误,通常是由于将不同类型的对象组合在一起而引起的,如将字符串和数字相加。
- ValueError:值错误,通常是由于提供的值不符合预期的范围或格式而引起的,如将字符串转换为整数时提供的字符串无效。
- IndexError:索引错误,通常是由于尝试访问列表或元组中不存在的元素而引起的。
- KeyError:键错误,通常是由于尝试访问字典中不存在的键而引起的。
- IOError:输入/输出错误,通常是由于尝试读取或写入文件时出现问题而引起的。
- AttributeError:属性错误,通常是由于尝试访问对象不存在的属性或方法而引起的。
在Python中,可以使用try-except语句来捕获异常并处理它们。try语句包含可能会导致异常的代码,而except语句定义了在捕获异常时要执行的代码。
可以使用多个except语句来捕获不同类型的异常,try-except 还可以跟else 进行搭配,它的含义就是当 try 语句没有检测到任何异常的情况下,就执行 else 语句的内容,另外也可以使用finally语句定义在try语句块之后始终要执行的代码。
例如:
案例1:使用try-except语句来捕获异常并处理它们
举例:
try:
100/0 # 可能会导致异常的代码
except ZeroDivisionError: #(捕获特定的异常类型ZeroDivisionError,ZeroDivisionError是Python中的内置异常类之一,用于表示在除数为零的情况下进行了除法操作所引发的异常。)
print('因为这里打印出异常类型:除数不能为0。')# 处理值错误的代码
案例2:使用try-except语句搭配else语句(当 try 语句没有检测到任何异常的情况下,就执行 else 语句的内容)
当 try 语句检测到任何异常的情况下,则不执行else 语句的内容
>>> try:
... 1 / 0
... except:
... print("逮到了~")
... else:
... print("没逮到~")
...
逮到了~
如果在 try 语句中检测到异常,那么就执行 except 语句的异常处理内容:
>>> try:
... 1 / 1
... except:
... print("逮到了~")
... else:
... print("没逮到~")
...
1.0
没逮到~
案例3:使用try-except语句搭配finally语句(无论异常发生与否,都必须要执行的语句finally语句)
举例:
try:
‘abc’+ 123
except TypeError: #TypeError为类型错误,通常是由于将不同类型的对象组合在一起而引起的,如将字符串和数字相加。
print('因为这里打印出异常类型:类型错误。')# 处理类型错误的代码
finally:
print('不论是否无法异常,都执行这句话') # 无论是否发生异常都会执行的代码
异常处理是Python中的重要概念之一,开发人员应该了解如何正确地捕获和处理异常,以确保程序的稳定性和可靠性。
进阶:捕获异常的方法
捕获异常的两种方法:不管是何种异常,都捕获异常信息。
1.使用Exception:所有的异常都是 Exception 的子类。所以 Exception能匹配所有类型的异常。
举例:
>>> try:
100/0
except Exception as e:
print('未知异常:', e)
# 对于很多刚学Python或者是学着学着迷茫了的小伙伴,我给大家准备了一套Python的学习资料。
# 包括数百本电子书、Python基础视频教程、项目实战,疑难解答,直接在文末名片自取。
未知异常: division by zero
>>>
可以正常捕获到异常的原因,但不能输出详细的异常信息(发送异常的位置和异常的代码)。
2.使用traceback模块:使用traceback模块里面的format_exc函数,可以显示异常的信息 和 异常产生处的函数调用栈的信息。
举例:
>>> import traceback
>>> try:
100/0
except :
print(traceback.format_exc())
Traceback (most recent call last):
File "<pyshell#5>", line 2, in <module>
ZeroDivisionError: division by zero
>>>
上面的代码会打印出导致异常的详细的函数调用栈的信息