【问题标题】:Try/except not catching errors in compiled Python尝试/除了在编译的 Python 中不捕获错误
【发布时间】:2012-07-15 21:36:19
【问题描述】:

我有一些涉及 Try 和 except 子句的代码。当我只是在 IDLE 的控制台中运行它时,它可以完美运行,并且永远不会崩溃。但是,当我编译时它无法捕获错误,所以程序崩溃了,这让我发疯!

代码是:

if self.height == 6:
    try:
        libtcod.path_compute(minimap[self.mapx][self.mapy].path3,self.x+60, self.y+60,target_x+60, target_y+60)
        stepx, stepy = libtcod.path_get(minimap[self.mapx][self.mapy].path3, 0)
        dx = stepx - self.x - 60
        dy = stepy - self.y - 60
    except:
        success = False  

我正在使用 libtcod 库。它有时会在 stepx/stepy 位上失败,问题是,我知道它有时会在那个位上失败;它只是没有抓住它!我试过让它在 stepx 部分之前/之后打印一条消息,它会打印第一部分,但不是后者。有很多选项可以导致success = False,只有一个,然后我会处理如果success == False 会发生什么(这是一个游戏,测试敌人是否可以找到你,如果没有,然后它尝试别的东西)。我不知道为什么它在未编译时可以捕获它,但在编译时完全失败。有人可以向我解释一下吗?

提前致谢!

【问题讨论】:

  • 当你说它“崩溃”时,究竟发生了什么?另外,“编译”是什么意思?如果你只是从命令行运行脚本(python foo.py),它可以工作吗?
  • Windows 遇到错误,即使我启用控制台,也没有控制台消息,它会死掉。这是使用py2exe;我在 Windows 上,我不确定如何执行命令行版本。如果我在 IDLE 中只选择“运行模块”选项(我对 Python 还是有点陌生​​),那么它可以完美地处理 try/except。
  • 我以前用过那个库。由于 python 版本是 C++ 库的包装器,因此它偶尔会遇到未正确引发为 python 错误的段错误。这就是这里发生的事情吗?
  • 啊,不用担心 - 我找到了解决它的方法,因为我发现如果找不到路径,函数实际上会返回 False,所以我不需要尝试尝试/除外。还是谢谢大家!
  • 那么……它实际上是在 IDLE 中引发异常还是您的整个问题都错了?

标签: python exception-handling compilation try-catch except


【解决方案1】:

尝试检查您传递给导致程序崩溃的 libtcod 函数的所有参数(在本例中为 libtcod.path_get)。当你传入不正确的参数而不是引发一个很好的错误消息时,Libtcod 经常会出现段错误,我在视野工具包中遇到了同样的问题。

如果这些值在您使用 py2exe “编译”的版本中由于某种原因而不同,那么这可以解释为什么它有时只会崩溃。

这部分看起来有问题:

minimap[self.mapx][self.mapy]

如果你有这样的嵌套数组:

minimap = [[1, 2, 3, 4],
           [5, 6, 7, 8],
           [9, 10, 11, 12]]

然后要引用位置 (x, y) 的项目,您必须使用 minimap[y][x]

编辑:

libtcod.path_get的第一个参数应该是一个用于寻路的地图,由path_new_using_mapdijkstra_new返回。您不需要为地图中的每个方格使用单独的地图。我认为您应该更彻底地阅读文档: http://doryen.eptalys.net/data/libtcod/doc/1.5.0/index.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 2022-06-21
    相关资源
    最近更新 更多