前言:上一篇感觉太多了,应该看完文件和os模块就不太想看最后的异常捕获了,所以这一章单独拿出来写异常捕获,而且里面大部分代码我都有进行详细的解释,各位肯定可以读懂滴拉~~
Python异常
异常的基本概念:
在 Python 中,异常是一种在程序执行过程中出现的错误情况。当程序遇到错误,如除零错误、索引超出范围、文件不存在等情况时,就会引发异常。异常会中断当前的执行流程,除非被捕获并处理,否则程序会终止运行。
异常显示:
异常捕获:
基本语法:
try...except:主要用于捕获代码运行时异常,如果异常发生,则执行except中的代码
python
try:
可能发⽣错误的代码
except:
如果出现异常执⾏的代码
异常处理的流程:
1.程序首先执行
try
代码块。2.如果在
try
代码块中没有发生异常,except
代码块不会被执行。3.如果发生异常,程序会跳转到匹配的
except
代码块,执行相应的异常处理代码。4.如果没有匹配的
except
代码块,异常会向上传播到调用栈的上一级,直到被捕获或程序终止。
多异常处理:
可以使用多个 except
子句来处理不同类型的异常:
python
try:
num = int("abc") # 这会引发 ValueError
result = 10 / num # 这会引发 ZeroDivisionError
print(result)
except ValueError:
print("输入不是有效的数字")
except ZeroDivisionError:
print("除数不能为零")
捕获多个异常:
可以将多个异常类型放在一个 except
子句中,使用元组:
python
try:
num = int("abc")
result = 10 / num
print(result)
except (ValueError, ZeroDivisionError):
print("输入错误或除数不能为零")
总结:
try-except****语句是 Python 中处理异常的重要工具,它可以帮助你使程序更健壮,避免因未处理的异常而导致程序崩溃。根据可能出现的异常类型和情况,合理地使用
try-except
语句,可以使程序更加可靠,提高用户体验和代码的可维护性。
捕获异常并输出错误信息:
python
try:
可能遇到的错误代码
except Exception as e:
print(e)
代码实例:
python
try:
# 可能引发异常的代码
result = 10 / 0 # 这会引发 ZeroDivisionError
except ZeroDivisionError as e:
# 捕获 ZeroDivisionError 异常并输出错误信息
print(f"捕获到 ZeroDivisionError 异常:{e}")
except Exception as e:
# 捕获其他未被特定处理的异常
print(f"捕获到其他异常:{e}")
代码解释:
-
try 块:
- 包含可能会引发异常的代码。在上述示例中,
10 / 0
会导致ZeroDivisionError
异常,因为除数不能为零。
- 包含可能会引发异常的代码。在上述示例中,
-
except ZeroDivisionError as e:
- 这部分用于专门捕获
ZeroDivisionError
异常。 as e
允许将异常对象存储在变量e
中,以便在异常处理代码中使用。- 打印出
ZeroDivisionError
异常的具体信息,包括异常类型和异常消息。
- 这部分用于专门捕获
-
except Exception as e:
- 这是一个通用的异常捕获语句,用于捕获其他未被特定处理的异常。
Exception
是所有内置异常的基类,因此它可以捕获除ZeroDivisionError
以外的其他异常。- 同样,
as e
存储异常对象,以便打印异常信息。
异常捕获中else语句:
else语句:表示的是如果没有异常要执行的代码。
基本结构:
python
try:
# 可能引发异常的代码块
except SomeException:
# 当发生 SomeException 异常时执行的代码块
else:
# 当 try 代码块中没有发生异常时执行的代码块
代码实例:
python
try:
result = 10 / 2 # 正常的除法运算
except ZeroDivisionError:
print("除数不能为零")
else:
print(f"结果是: {result}")
代码解释
- try 代码块 :
- 包含可能引发异常的代码。在这个例子中,
10 / 2
是一个正常的除法运算,不会引发异常。
- 包含可能引发异常的代码。在这个例子中,
- except ZeroDivisionError :
- 用于捕获
ZeroDivisionError
异常。由于try
代码块中没有发生该异常,所以不会执行此代码块。
- 用于捕获
- else 代码块 :
- 当
try
代码块中没有发生异常时,执行此代码块。在这里,会打印出除法运算的结果。
- 当
异常捕获中finally语句:
基本概念: 在 Python 的异常处理机制中,finally
子句是一个非常重要的部分,它的主要作用是确保无论 try
块中的代码是否引发异常,其中的代码都会被执行。
基本结构:
python
try:
# 可能引发异常的代码块
except SomeException:
# 当发生 SomeException 异常时执行的代码块
else:
# 当 try 代码块中没有发生异常时执行的代码块
finally:
# 无论是否发生异常都会执行的代码块
代码实例:
python
def divide(x, y):
try:
result = x / y
print(f"结果是: {result}")
except ZeroDivisionError:
print("除数不能为零")
finally:
print("这是 finally 子句,总是会执行")
# 调用函数
divide(10, 2)
divide(10, 0)
代码解释
- try 代码块 :
- 包含可能引发异常的代码。在
divide(10, 2)
中,执行正常的除法运算,在divide(10, 0)
中,会引发ZeroDivisionError
。
- 包含可能引发异常的代码。在
- except ZeroDivisionError :
- 当发生
ZeroDivisionError
异常时,会打印相应的错误信息。
- 当发生
- finally 代码块 :
- 无论是否发生异常,都会打印
"这是 finally 子句,总是会执行"
。
- 无论是否发生异常,都会打印
总结finally的作用:
finally
通常用于释放资源,如关闭文件、关闭数据库连接、释放锁等,确保资源在使用后被正确释放,避免资源泄漏。即使
try
块中引发了异常或except
块中引发了新的异常,finally
块中的资源清理代码仍然会执行。异常传播:
如果
finally
块中引发了异常,它会覆盖try
或except
块中引发的异常。 在finally
块中引发异常时要谨慎,避免掩盖了原有的异常。使用
finally
子句可以确保重要的操作(如资源清理)在任何情况下都能完成,提高代码的健壮性和可靠性,特别是在涉及资源管理时非常有用。
finally语句与else语句的区别:
else
子句:
只有在 try
块中没有发生异常时才会执行。
主要用于在没有异常发生时执行正常的操作,使正常操作和异常处理分离。
finally
子句:
无论是否发生异常都会执行。
侧重于资源清理和保证某些操作的最终执行。
结:对于异常捕获的详细解释就到这里拉,如果有问题的话,再后面还会有补充的