Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 14, 2016 21:46:20

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Обработка ошибок

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

Офлайн

#2 Апрель 15, 2016 00:17:17

A.N.Onim
Зарегистрирован: 2015-11-08
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработка ошибок

Не совсем понял) Так запутано написали) Но может вам стоит взглянуть на многопоточность и модуль threading?

Ну и конечно же, try/except/else/finally )))

Отредактировано A.N.Onim (Апрель 15, 2016 00:18:15)

Офлайн

#3 Апрель 15, 2016 00:32:59

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Обработка ошибок

Без кода вас врядли до конца понять можно.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#4 Апрель 15, 2016 03:29:17

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Обработка ошибок

Скажем, вот такой пример.

#!/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 ''
Однако, это может сильно усложнить отладку.

Офлайн

#5 Апрель 15, 2016 09:14:09

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Обработка ошибок

Существуют две общепринятые практики обработки ошибок.
обработка парами try … except и анализом возвращаемого кода ошибки. У каждого метода есть достоинства и недостатки. Присваивание глобальной переменной кода ошибки это нонсенс. Но например так устроена winapi с ее geterrorcode :).

Внимательно не смотрел что вы там понаделали, но похоже try except вам вполне подойдет.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version