【问题标题】:Python - My class raise ValueError, but it is not handled by exceptPython - 我的班级引发了 ValueError,但它不是由 except 处理的
【发布时间】:2025-12-10 06:35:01
【问题描述】:

我的示例代码:

from tkinter import *

class first:
    def __init__(self):
        self.top = Tk()
        ...
    def test(self):
        try:
            self.value = self.dict[key]
        except KeyError:
            try:
                second()
            except ValueError:
                print('Finally')

class second:
    def __init__(self):
        self.frame = Toplevel()
        ...
        self.button = ttk.Button(parent=self.frame, text='GO', command=self.go_click)
        ...

    def go_click(self):
        raise ValueError('Not Valid')

这只是一个例子!问题是 ValueError 是由第二类引发的,但不是由第一类的 except 子句处理的。在回溯下方:

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python34\lib\tkinter\__init__.py", line 1487, in __call__
    return self.func(*args)
File "........", line xxx, in goclick
    raise ValueError('Not Valid')
ValueError: Not Valid

如何正确处理?

谢谢,

【问题讨论】:

  • 因为你在go_click()之前完成了对second()的调用
  • 你没有处理go_click
  • 您的try 只会捕获在创建类实例期间发生的异常。它不会捕获类的任何部分引发的所有异常。
  • 谢谢@BrenBarn,我将不得不以另一种方式处理它。

标签: python exception raise


【解决方案1】:

试试这个

from tkinter import *

class first:
    def __init__(self):
        self.top = Tk()
        ...
    def test(self):
        try:
            self.value = self.dict[key]
        except KeyError:
            try:
                second()
            except ValueError:
                print('Finally')
            print "OK CALLED SECOND()!!!!" #######THIS PRINT MEANS YOUR DONE HERE

class second:
    def __init__(self):
        self.frame = Toplevel()
        ...
        self.button = ttk.Button(parent=self.frame, text='GO', command=self.go_click)
        ...

    def go_click(self):
        raise ValueError('Not Valid')

为了实际处理该错误,您需要覆盖 tkinters 事件循环......不是很容易(或一般来说是好的做法)

更好的方法是处理 go_click 函数中的错误,类似于

  def go_click(self):
      try:
         self.submit_form()
      except ValueError:
         print "VALIDATION ERROR!!"

【讨论】:

  • 所以我需要以另一种方式处理它。谢谢。
最近更新 更多