You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:18:03