
在实际编程中,我们经常需要处理用户输入的数据,并确保这些数据符合特定的业务规则或数值范围。当数据不符合预期时,抛出并捕获自定义异常是一种优雅且专业的方式来管理程序流程和错误状态。本教程将通过一个具体的案例,演示如何接收一组整数输入,校验其范围,计算符合条件的数的立方,并将结果(或异常类型)存储在一个字典中,最终打印出字典的全部内容。
我们需要编写一个Python程序,执行以下操作:
初始尝试可能面临的挑战是,如何确保即使发生异常,程序也能继续处理后续输入,并将异常信息以清晰的方式记录在字典中,而不是中断整个程序的执行。
首先,我们定义两个继承自Exception的自定义异常类:NumberTooSmall和NumberTooBig。这些异常类将用于在输入值超出预设范围时进行标记。
class NumberTooSmall(Exception):
"""当数字小于3时抛出的自定义异常"""
def __init__(self, num):
self.num = num # 存储导致异常的数字
super().__init__(f"数字 {num} 过小,必须大于等于3")
class NumberTooBig(Exception):
"""当数字大于30时抛出的自定义异常"""
def __init__(self, num):
self.num = num # 存储导致异常的数字
super().__init__(f"数字 {num} 过大,必须小于等于30")在__init__方法中,我们存储了导致异常的具体数值,这在后续处理异常时非常有用。同时,调用super().__init__可以为异常提供一个默认的错误消息。
立即学习“Python免费学习笔记(深入)”;
解决“无论是否发生异常,都打印字典内容”的关键在于将try-except块放置在处理每个输入的循环内部。如果将try-except块放在整个循环外部,一旦第一个异常发生,程序就会跳出循环,无法处理剩余的输入。
正确的做法是,对每一个输入值进行单独的校验和处理:
这种策略确保了即使某个输入值引发了异常,程序也能继续处理后续的输入,从而构建一个更健壮的程序。
我们将接收的五个整数存储在一个列表中,并对其进行排序,这有助于保持输出的有序性,尽管这不是强制要求。
# 假设的输入,实际应用中可以通过 input() 获取
# n1, n2, n3, n4, n5 = int(input()), int(input()), int(input()), int(input()), int(input())
# 为了演示方便,我们直接使用一组测试数据
All_inputs = sorted([3, 7, 9, 22, 34]) # 模拟输入并排序
result_dict = {} # 用于存储结果的字典
for num in All_inputs:
try:
if num < 3:
raise NumberTooSmall(num)
elif num > 30:
raise NumberTooBig(num)
else:
result_dict[num] = num ** 3 # 存储正常值及其立方
except NumberTooSmall as e:
result_dict[e.num] = 'NumberTooSmall' # 存储异常数字及其类型
except NumberTooBig as e:
result_dict[e.num] = 'NumberTooBig' # 存储异常数字及其类型在上述代码中,我们直接将异常的数字(通过e.num获取)作为字典的键,而异常类型(例如'NumberTooSmall')作为字典的值。这种方式比在字典中创建特殊键(如'NumberTooSmall': problematic_num)更加直观,因为它保持了原始输入数字作为主键的语义。
最后,我们需要遍历result_dict并以清晰的格式打印其内容。使用f-string是Python中推荐的字符串格式化方式,它简洁且易读。
print("--- 最终处理结果 ---")
for key, value in result_dict.items():
print(f"{key} : {value}")将上述所有部分整合,得到一个完整的、功能完善的程序:
class NumberTooSmall(Exception):
"""当数字小于3时抛出的自定义异常"""
def __init__(self, num):
self.num = num
super().__init__(f"数字 {num} 过小,必须大于等于3")
class NumberTooBig(Exception):
"""当数字大于30时抛出的自定义异常"""
def __init__(self, num):
self.num = num
super().__init__(f"数字 {num} 过大,必须小于等于30")
def process_numbers(inputs):
"""
处理一组整数,校验范围,计算立方或记录异常类型,并存储在字典中。
"""
result_dict = {}
# 对输入进行排序,以确保输出顺序一致性
sorted_inputs = sorted(inputs)
for num in sorted_inputs:
try:
if num < 3:
raise NumberTooSmall(num)
elif num > 30:
raise NumberTooBig(num)
else:
result_dict[num] = num ** 3
except NumberTooSmall as e:
result_dict[e.num] = 'NumberTooSmall'
except NumberTooBig as e:
result_dict[e.num] = 'NumberTooBig'
return result_dict
def print_results(data_dict):
"""
以指定格式打印字典内容。
"""
print("--- 最终处理结果 ---")
for key, value in data_dict.items():
# 根据原始问题期望的输出格式,针对异常情况进行特殊处理
# 但更通用的做法是统一格式,如 {key} : {value}
# 这里我们采用更通用的 f-string 格式
print(f"{key} : {value}")
# 模拟用户输入
# 实际应用中可以使用循环和 input() 获取
# numbers = []
# print("请输入5个整数:")
# for _ in range(5):
# while True:
# try:
# num = int(input(f"请输入第{_ + 1}个整数: "))
# numbers.append(num)
# break
# except ValueError:
# print("无效输入,请输入一个整数。")
# 示例输入
example_inputs = [3, 7, 9, 22, 34]
# 如果要模拟原始问题中的输入,可以替换为:
# example_inputs = [3, 7, 9, 22, 34] # 假设用户输入了这些数字
# 处理数字并获取结果字典
processed_data = process_numbers(example_inputs)
# 打印结果
print_results(processed_data)
使用示例输入 [3, 7, 9, 22, 34] 运行上述代码,将得到如下输出:
--- 最终处理结果 --- 3 : 27 7 : 343 9 : 729 22 : 10648 34 : NumberTooBig
这个输出清晰地展示了每个输入数字的处理结果:在范围内的数字显示其立方,超出范围的数字则显示其对应的异常类型。
通过以上步骤,我们成功构建了一个能够健壮处理用户输入、进行范围校验、并优雅地报告异常的Python程序。这种模式在需要处理大量数据并对每个数据点进行独立验证的场景中非常有用。
以上就是Python中自定义异常处理与范围校验:构建健壮的整数处理程序的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号