Найти - Пользователи
Полная версия: Обработка ошибок
Начало » Python для новичков » Обработка ошибок
1
vanvanov
Как грамотно обрабатывать ошибки, не разрешая двигаться вперед, но при этом и не позволяя программе полностью свалиться где-то глубоко в дебрях? На данный момент у меня в каждой процедуре стоит проверка определенной переменной. Процедура не выполняется, если переменная True. Таким образом, при критической ошибке (недостаточно данных, неверные данные на входе), которая не позволяет проводить цепочку процедур, эта цепочка отменяется и программа возвращается в первоначальную процедуру (меню действий), из которой эта цепочка была запущена. Первоначальная процедура устанавливает значение False, и пользователь может производить другие действия по своиму усмотрению. До недавнего времени такой подход меня устраивал. Однако, если запустить одновременно 2 виджета, то при таком подходе ошибка в одном приводит к завершению второго. В общем, вопрос: как грамотно обрабатывать ошибки?
A.N.Onim
Не совсем понял) Так запутано написали) Но может вам стоит взглянуть на многопоточность и модуль threading?

Ну и конечно же, try/except/else/finally )))
JOHN_16
Без кода вас врядли до конца понять можно.
vanvanov
Скажем, вот такой пример.

#!/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()
Пример рабочий. Но что будет, если на входе будет, например, не строка, а None? Если убрать проверку AbortAll - получим ошибку. Если не убрать - везде будет глобальная отмена, в результате, если не будут обработаны данные для 1-го виджета, то и 2-й виджет останется незаполненным. Пока что вижу такие варианты:
1) Смириться с тем, что если одна цепочка процедур дает сбой, то и вторую тоже приходится завершать
2) Возвращать фейковые данные, если на входе что-то не то. Например:
if text is None:
return ''
Однако, это может сильно усложнить отладку.
doza_and
Существуют две общепринятые практики обработки ошибок.
обработка парами try … except и анализом возвращаемого кода ошибки. У каждого метода есть достоинства и недостатки. Присваивание глобальной переменной кода ошибки это нонсенс. Но например так устроена winapi с ее geterrorcode :).

Внимательно не смотрел что вы там понаделали, но похоже try except вам вполне подойдет.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB