异常是指程序运行的过程中出现了错误,也是bug。异常处理是Python编程中超级重大的概念,它允许程序在遇到错误时优雅地处理问题,而不是直接崩溃。
使用try…except捕获异常
基本语法:
try:
# 可能引发异常的代码
result = 10 / 0
except ZeroDivisionError:
# 处理特定异常
print("不能除以零!")
捕获指定的异常:
try:
print(1/0)
except ZeroDivisionError as z:
print(f"出现了异常{z}")
print("程序继续")
处理多个异常:
try:
number = int(input("请输入一个数字: "))
result = 10 / number
except ValueError:
print("输入的不是有效数字!")
except ZeroDivisionError:
print("不能除以零!")
except Exception as e:
# 处理其他所有异常
print(f"发生了未知错误: {e}")
finally块
在异常处理中,finally块中的代码无论是否出现异常,都会执行。
有些时候,程序在try块里面打开了一些物理资源,如数据库连接、网络连接和磁盘文件等。这些物理资源都必须被显式回收。
try:
# 可能引发异常的代码
file = open("example.txt", "r")
content = file.read()
number = int(content)
result = 100 / number
except FileNotFoundError:
print("文件不存在!")
except ValueError:
print("文件内容不是有效数字!")
except ZeroDivisionError:
print("不能除以零!")
else:
# 如果没有异常发生,执行这里的代码
print(f"计算结果是: {result}")
finally:
# 无论是否发生异常,都会执行这里的代码
print("程序执行完毕")
# 一般用于清理资源,如关闭文件、数据库连接等
抛出异常(raise)
当程序出现错误时,系统会自动引发异常。除此之外,Python也允许程序自行引发异常,自行引发异常使用raise语句来完成。一般是业务逻辑上,业务异常问题,可以自行引发异常。
语法格式:raise [exceptionName [(reason)]]
def process_value(value):
if not isinstance(value, (int, float)):
raise TypeError("参数必须是数字类型")
if value < 0:
raise ValueError("参数不能为负数")
return value ** 2
try:
result = process_value(-5)
except (TypeError, ValueError) as e:
print(f"错误: {e}")
自定义异常
实际开发中,有时候系统提供的异常类型不能满足开发的需求。这时候你可以通过创建一个新的异常类来拥有自己的异常。异常类继承自Exception类,可以直接继承,或者间接继承。
#自定义异常类
class TooLongException(Exception):
def __init__(self, length):
self.length = length
def __str__(self):
return f"长度是:{self.length},超长了"
def name_test():
try:
name = input("请输入您的姓名:")
if len(name) > 4:
raise TooLongException(len(name))
else:
print(name)
except TooLongException as tle:
print("出现异常:",tle)
name_test()
'''
请输入您的姓名:12345
出现异常: 长度是:5,超长了
'''
异常的传递性
异常是具有传递性的,如果方法A调用方法B,方法B调用方法C,如果方法C代码出现异常,并且没有处理异常,则会传递给方法B,同理,如果B依然没有处理异常,则最终会传递给方法A。
def func():
print("func开始")
r = 1/0
print("func结束")
def funb():
print("funb开始")
func()
print("funb结束")
def funa():
print("funa开始")
funb()
print("funa结束")
try:
funa()
except Exception as e:
print(e)
'''
输出:
funa开始
funb开始
func开始
division by zero
'''
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...
