如何找出我未处理的异常是什么

时间:2013-03-06 21:51:49

标签: python exception exception-handling tkinter

这可能是有史以来最愚蠢的问题,但我完全不知道我得到的异常是什么,我所知道的是我得到一个而谷歌不想让我知道为什么。

以下是它的说法:

Unhandled exception in thread started by <function draw at 0x02A403B0>

这就是造成它的原因,虽然如果有人能告诉我我的坏代码是什么就好了,我也很想知道下次发生这种情况时我怎么能找到自己,因为这个发生了这么多。

def draw():
    while True:
        for x in range(0,10):
            for y in range (0,10):
                if (coord[x][y] == 0):
                    canvas.create_rectangle((x * 40) + 10, (y * 40) + 10, (x * 40) + 50, (y * 40) + 50, fill="white")
                if (coord[x][y] == 1):
                    canvas.create_rectangle((x * 40) + 10, (y * 40) + 10, (x * 40) + 50, (y * 40) + 50, fill="red")
                if (coord[x][y] == 2):
                    canvas.create_rectangle((x * 40) + 10, (y * 40) + 10, (x * 40) + 50, (y * 40) + 50, fill="darkorange")
    time.sleep(0.03)

2 个答案:

答案 0 :(得分:4)

仅用于调试,我会将整个内容包含在try-except中打印异常并重新提升它:

def draw():
    try:
        while True:
            for x in range(0,10):
                for y in range (0,10):
                    if (coord[i][j] == 0):
                        canvas.create_rectangle((x * 40) + 10, (y * 40) + 10, (x * 40) + 50, (y * 40) + 50, fill="white")
                    if (coord[i][j] == 1):
                        canvas.create_rectangle((x * 40) + 10, (y * 40) + 10, (x * 40) + 50, (y * 40) + 50, fill="red")
                    if (coord[i][j] == 2):
                        canvas.create_rectangle((x * 40) + 10, (y * 40) + 10, (x * 40) + 50, (y * 40) + 50, fill="darkorange")
        time.sleep(0.03)
    except Exception as e:
        print(e)
        raise

答案 1 :(得分:1)

无法从运行mainloop的线程之外的任何线程调用Tkinter对象。相反,您应该删除线程的使用,并删除无限循环的使用。相反,做这样的事情(虽然,我不知道i和j来自哪里,我只是复制你的代码......):

def draw():
    for x in range(0,10):
        for y in range (0,10):
            item = canvas.create_rectangle((x * 40) + 10, (y * 40) + 10, 
                                           (x * 40) + 50, (y * 40) + 50)
            if (coord[i][j] == 0):
                canvas.itemconfig(item, fill="white")
            if (coord[i][j] == 1):
                canvas.itemconfig(item, fill="red")
            if (coord[i][j] == 2):
                canvas.itemconfig(item, fill="darkorange")
    canvas.after(30, draw)

这利用了已经有无限循环运行的事实 - 事件循环。事件循环的每次迭代(或者更确切地说,事件循环中每30毫秒)都会调用draw。

但是,这段代码看起来像是一个真正的内存耗尽。你真的打算每30毫秒继续创建一个新的矩形吗?最终你会遇到性能问题,因为你最终会得到数十万个重叠的矩形。