Я разработал несколько программ Python для других, которые используют Tkinter для получения ввода от пользователя. Для упрощения и удобства использования командной строки или консоли python никогда не возникают (т. Е. Файлы .pyw), поэтому я изучаю использование библиотеки журналов для записи текста ошибки в файл, когда исключение. Тем не менее, мне трудно получить его, чтобы на самом деле поймать исключения. Например:Сохранение исключений в Tkinter с использованием Python
Напишем функцию, которая будет вызывать ошибку:
def cause_an_error():
a = 3/0
Теперь мы пытаемся зарегистрировать ошибку обычно:
import logging
logging.basicConfig(filename='errors.log', level=logging.ERROR)
try:
cause_an_error()
except:
logging.exception('simple-exception')
Как и ожидалось, программные ошибки и записываются данные ошибка error.log. В консоли ничего не появляется. Однако, есть другой результат, когда мы реализуем интерфейс Tkinter, например так:
import logging
import Tkinter
logging.basicConfig(filename='errors.log', level=logging.ERROR)
try:
root = Tkinter.Tk()
Tkinter.Button(root, text='Test', command=cause_an_error).pack()
root.mainloop()
except:
logging.exception('simple-exception')
В этом случае, при нажатии кнопки в окне Tkinter вызывает ошибку. Однако, на этот раз, ничего не записывается в файл, и появляется следующее сообщение об ошибке в консоли:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python27\lib\lib-tk\Tkinter.py", line 1536, in __call__
return self.func(*args)
File "C:/Users/samk/Documents/GitHub/sandbox/sandbox2.pyw", line 8, in cause_an_error
a = 3/0
ZeroDivisionError: integer division or modulo by zero
Есть ли другой способ поймать и войти эту ошибку?
Tkinter работает на своем собственном потоке, и все, что приходит после того, как 'root.mainloop' выполняется только после того, как вы закрываете окно. Также обратите внимание, что 'cause_an_error' выполняется только при нажатии кнопки, но сначала выполняется' root.mainloop'. Вероятно, происходит то, что исключение не поймано, потому что его бросают в другую «среду» ... Надеюсь, что кто-то придумает более подробный и технический ответ. – nbro
Интересно. Теперь, когда вы упомянули об этом, команда «raise» также не может получить ошибку, поэтому ее, безусловно, бросают в другую среду. Есть ли способ, с помощью которого я мог бы модифицировать обработку ошибок Tkinter для включения регистрации после импорта? –
Вы можете поймать исключение в функции напрямую ... – nbro