Python调用不可修改的zero函数时,如何判断其是否触发了异常
实现方案
因为zero函数内部已经捕获了所有异常且没有向外抛出,仅在触发除零逻辑时打印固定字符串cannot divide by zero,我们可以通过以下无需修改zero源码的方案实现异常触发判断:
方法1:临时重定向标准输出捕获打印内容(最稳定易实现)
核心逻辑是临时接管系统标准输出,捕获zero函数运行时的打印内容,通过匹配异常提示字符串判断是否触发了内部异常。
示例代码如下:
import sys import io def call_zero_and_check(a, b): # 备份原始标准输出 original_stdout = sys.stdout # 创建字符串IO对象接管输出 captured = io.StringIO() sys.stdout = captured try: zero(a, b) finally: # 恢复原始标准输出,避免影响后续代码 sys.stdout = original_stdout # 匹配异常提示字符串 return captured.getvalue().strip() == "cannot divide by zero" def main(): res1 = call_zero_and_check(10, 5) print(f"zero(10,5)是否触发异常:{res1}") # 输出False res2 = call_zero_and_check(10, 0) print(f"zero(10,0)是否触发异常:{res2}") # 输出True
方法2:运行时追踪异常栈(无需依赖打印内容)
如果zero的异常打印逻辑可能变化,可以用sys.settrace追踪函数执行过程中是否捕获了除零异常,该方案复杂度稍高,不依赖函数的打印输出。
示例代码如下:
import sys def trace_calls(frame, event, arg): if event == 'exception': exc_type = arg[0] if exc_type == ZeroDivisionError and frame.f_code.co_name == 'zero': # 标记zero函数内部触发了除零异常 global has_zero_exception has_zero_exception = True return trace_calls def call_zero_and_check(a, b): global has_zero_exception has_zero_exception = False sys.settrace(trace_calls) zero(a, b) sys.settrace(None) return has_zero_exception def main(): res1 = call_zero_and_check(10, 5) print(f"zero(10,5)是否触发异常:{res1}") # 输出False res2 = call_zero_and_check(10, 0) print(f"zero(10,0)是否触发异常:{res2}") # 输出True
两种方案均无需修改
zero函数的原有代码,符合题目约束。
内容的提问来源于stack exchange,提问作者zach
相关产品推荐
相关产品推荐

