0
私は、Python TkInter GUIプログラムでは、すべての例外をキャッチしてエンドユーザーに提示するために、try/exceptブロックに全体を囲むことがベストプラクティスであることを確認しました。プログラムは一見何の理由もありません)。一般的な "try/except"ブロックがPython TkInterコールバックに適用されないのはなぜですか?
ただし、このアプローチにはいくつかの問題があります。ボタンがクリックされたときに0で除算しようとし、次の小さなプログラムを考えてみましょう:
import tkinter
class Foo():
def __init__(self):
# Initialize a new GUI window
root = tkinter.Tk()
# The "Generic error" message is shown when the following is uncommented
#number = 1/0
# Define a button and draw it
button = tkinter.Button(root, text='Generate an error', command=self.generate_error)
button.pack()
# Loop forever
root.mainloop()
def generate_error(self):
# The "Generic error" message is not shown
number = 1/0
if __name__ == '__main__':
try:
# Run the Foo class
Foo()
except Exception as e:
print('Generic error:', str(e))
なぜ「一般的なエラー」の文は、ボタンのコールバック関数には適用されませんか?
エラーを生成するコードは 'try'ブロックに含まれていないためです。つまり、 'Foo()'を呼んでも例外は発生しません。 – kindall
あなたのコメントは不明です。すべてを包括的なtry/exceptブロックに囲む適切な方法を示すためにコードスニペットを修正できますか? – James
UIレイヤーはスレッドを使用するため、ほぼ確実です。他のスレッドの例外は、メインスレッドに伝播されません。 –