异常处理打印语句无法生效,但错误类型判断正常?技术求助
问题分析与修复方案
你的代码无法打印自定义错误消息,核心问题出在类型判断逻辑错误和判断顺序不合理,导致自定义异常从未被触发:
问题点拆解
- 错误的类型比较:
type(r) == 'complex'、type(r) == str是完全错误的写法。type()返回的是类型对象(比如<class 'complex'>),而非字符串,和字符串比较永远为False,你的自定义异常根本不会被抛出。 - 判断顺序错误:复数、字符串会先进入
r < 0的判断,触发Python内置异常(复数无法比较大小、字符串不能和数字比较),直接跳过了你的自定义异常逻辑。
修复后的代码
import numpy as np def compute_circle_area(r): try: # 先处理类型问题,避免后续数值比较触发内置异常 if isinstance(r, complex): raise TypeError('Argument is complex') elif isinstance(r, str): raise TypeError('Argument is wrong type') elif r < 0: raise ValueError('Argument < 0') a = np.pi * r * r except ValueError as ve: print("Value Error", ve) except TypeError as te: print("Type Error", te) else: print('Argument works, solution is: ', a) return a # 补充返回值,避免原函数默认返回None finally: print("Let's continue") # 测试用例 print(compute_circle_area(2.1)) print(compute_circle_area(2+1j)) print(compute_circle_area(-2.1)) print(compute_circle_area('radius'))
修复说明
- 标准类型判断:用
isinstance()替代错误的字符串比较,这是Python判断类型的标准写法,还支持继承场景的类型检查。 - 调整判断顺序:先检查类型问题(复数、字符串),再判断数值是否为负,确保自定义异常能被优先触发。
- 补充返回值:原函数在正常分支没有返回计算结果,导致打印函数调用时输出
None,新增return a返回正确的面积值。
运行结果(符合预期)
Argument works, solution is: 13.854423602330987 13.854423602330987 Let's continue Type Error Argument is complex None Let's continue Value Error Argument < 0 None Let's continue Type Error Argument is wrong type None Let's continue
内容的提问来源于stack exchange,提问作者confusedphysicist
相关产品推荐
相关产品推荐

