Форум сайта python.su
4
Как грамотно обрабатывать ошибки, не разрешая двигаться вперед, но при этом и не позволяя программе полностью свалиться где-то глубоко в дебрях? На данный момент у меня в каждой процедуре стоит проверка определенной переменной. Процедура не выполняется, если переменная True. Таким образом, при критической ошибке (недостаточно данных, неверные данные на входе), которая не позволяет проводить цепочку процедур, эта цепочка отменяется и программа возвращается в первоначальную процедуру (меню действий), из которой эта цепочка была запущена. Первоначальная процедура устанавливает значение False, и пользователь может производить другие действия по своиму усмотрению. До недавнего времени такой подход меня устраивал. Однако, если запустить одновременно 2 виджета, то при таком подходе ошибка в одном приводит к завершению второго. В общем, вопрос: как грамотно обрабатывать ошибки?
Офлайн
0
Не совсем понял) Так запутано написали) Но может вам стоит взглянуть на многопоточность и модуль threading?
—
Ну и конечно же, try/except/else/finally )))
Отредактировано A.N.Onim (Апрель 15, 2016 00:18:15)
Офлайн
221
Без кода вас врядли до конца понять можно.
Офлайн
4
Скажем, вот такой пример.
#!/usr/bin/python3 import tkinter as tk import sys globs = {'AbortAll':False} class Top: def __init__(self): self.widget = tk.Toplevel(root) self.widget.withdraw() def show(self): self.widget.deiconify() class Text: def __init__(self,parent_obj): self.parent_obj = parent_obj self.widget = tk.Text(self.parent_obj.widget) self.widget.pack(expand=1,fill='both') def insert(self,text='text'): self.widget.insert('1.0',text) def quit_real(*args): root.destroy() sys.exit() def run1(text): if not text: globs['AbortAll'] = True if globs['AbortAll']: return None else: return text.strip() def run2(widget,text): if globs['AbortAll']: pass else: widget.insert('1.0',text) root = tk.Tk() root.protocol("WM_DELETE_WINDOW",quit_real) root.withdraw() top1 = Top() txt1 = Text(top1) top2 = Top() txt2 = Text(top2) top1.show() top2.show() class Chains: def __init__(self,handler,text): self.handler = handler self.text = text def process(self): self.text = run1(self.text) run2(self.handler.widget,self.text) #text1 = None text1 = ' Жили у бабуси 2 веселых гуся. ' text2 = ' Кто в Москве не бывал - красоты не видал. ' chain1 = Chains(txt1,text1) chain2 = Chains(txt2,text2) chain1.process() chain2.process() root.mainloop()
if text is None: return ''
Офлайн
253
Существуют две общепринятые практики обработки ошибок.
обработка парами try … except и анализом возвращаемого кода ошибки. У каждого метода есть достоинства и недостатки. Присваивание глобальной переменной кода ошибки это нонсенс. Но например так устроена winapi с ее geterrorcode :).
Внимательно не смотрел что вы там понаделали, но похоже try except вам вполне подойдет.
Офлайн