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

移植MATLAB代码时,rethrow()对应的Python等效实现是什么?

问题解答

现有代码问题说明

你目前编写的Python代码不满足要求,raise(e)的写法无法保留原始异常的调用栈,和MATLAB的rethrow效果不一致。

正确实现方式

Python中要实现和MATLAB rethrow完全一致、保留原始异常全部信息与调用栈的效果,不需要将异常对象作为参数传递给raise语句,直接使用无参的raise即可。
修改后的完整代码如下:

import numpy as np

# rows, cols 提前初始化
success = False
while not success:
    try:
        var = np.zeros([rows, cols])
        success = True
    except MemoryError as e:
        print('Process memory: Decreasing cols value because out of memory')
        success = False
        var = []
        cols -= 1
        if cols < 1:
            # 无参raise,保留原始异常栈信息
            raise

原理解释

  • 当你在except块中使用raise e时,Python会将异常的触发位置重置为当前raise语句所在行,丢失原始异常的调用栈信息,无法追溯错误最初发生的位置。
  • 直接使用无参raise时,Python会原样抛出当前捕获的异常,完全保留原始的调用栈、异常类型和错误信息,和MATLAB官方描述的rethrow行为完全匹配:

rethrow不会从执行方法的位置生成新的调用栈,而是会保留原始异常的全部信息,便于追溯原始错误的来源。

内容的提问来源于stack exchange,提问作者Java Jaard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:06:06