Python的异常处理是编程中非常重要的一部分,它允许程序在运行时遇到错误时优雅地处理这些错误,而不是简单地崩溃。异常处理机制包括try
、except
、else
、finally
等关键字,它们共同工作以捕获和处理程序中可能出现的错误。
1.异常的基本概念
在Python中,异常是程序在运行时发生的错误。当Python解释器遇到无法处理的错误时,它会抛出一个异常。如果异常没有被捕获和处理,程序将终止执行,并打印出错误信息和堆栈跟踪。
2.异常处理的基本结构
常规异常
try:可能发生错误的代码
except:如果出现异常执行的代码
#需求:尝试以`r`模式打开文件,如果文件不存在,则以`w`方式打开。
try:f = open('linux.txt', 'r')
except:f = open('linux.txt', 'w')
异常处理的基本结构由try
和except
块组成。try
块中放置可能引发异常的代码,而except
块则用于捕获并处理这些异常。
指定异常
try:# 尝试执行的代码result = 10 / 0
except ZeroDivisionError:# 如果在try块中引发了ZeroDivisionError,则执行这里的代码print("除数不能为0")
① 如果尝试执行的代码的异常类型和要捕获的异常类型不一致,则无法捕获异常。
② 一般try下方只放一行尝试执行的代码。
3.捕获多种异常
你可以使用多个except
块来捕获不同类型的异常,或者使用单个except
块来捕获多种异常。
try:# 尝试执行的代码pass
except ZeroDivisionError:# 处理除数为0的异常print("除数不能为0")
except TypeError:# 处理类型错误print("类型错误")# 或者使用元组来捕获多种异常
try:# 尝试执行的代码pass
except (ZeroDivisionError, TypeError):# 处理除数为0或类型错误的异常print("发生了除数为0或类型错误")
4.else和finally块
else
块是可选的,它会在没有异常发生时执行。finally
块也是可选的,无论是否发生异常,finally
块中的代码都会被执行。这通常用于执行清理操作,如关闭文件或释放资源。
try:# 尝试执行的代码pass
except ZeroDivisionError:# 处理异常print("除数不能为0")
else:# 如果没有异常发生,则执行这里的代码print("一切正常")
finally:# 无论是否发生异常,都会执行这里的代码print("执行清理操作")
5.抛出异常
除了捕获和处理异常外,Python还允许你使用raise
语句手动抛出异常。
if x < 0:raise ValueError("x 不能是负数")
6.自定义异常
Python允许你通过继承内置的Exception
类来创建自定义异常。
class MyCustomError(Exception):"""自定义异常类"""def __init__(self, message="这是一个自定义异常"):self.message = messagesuper().__init__(self.message)try:# 触发自定义异常raise MyCustomError("出错了!")
except MyCustomError as e:print(e)
7.异常的传递
异常是具有传递性的
当函数func01中发生异常, 并且没有捕获处理这个异常的时候, 异常
会传递到函数func02, 当func02也没有捕获处理这个异常的时候
main函数会捕获这个异常, 这就是异常的传递性.
提示:
当所有函数都没有捕获异常的时候, 程序就会报错
利用异常具有传递性的特点, 当我们想要保证程序不会因为异常崩溃的时候,就可以在main函数中设置异常捕获, 由于无论在整个程序哪里发生异常, 最终都会传递到main函数中, 这样就可以确保所有的异常都会被捕获