Error handling implemented

This commit is contained in:
Balthasar Reuter
2018-07-16 23:46:12 +02:00
parent 1997a8989f
commit 3dd0ebcae4
3 changed files with 66 additions and 84 deletions

View File

@@ -52,7 +52,7 @@ class Context:
logging.debug('Handling event "{}"'.format(event))
if isinstance(event, ErrorEvent):
self.state = ErrorState(event.exception, self.state)
self.state = ErrorState(event.origin, event.message, self.state)
elif isinstance(event, TeardownEvent):
self.state = TeardownState(event.target)
if event.target == TeardownEvent.EXIT:
@@ -92,27 +92,41 @@ class Event:
class ErrorEvent(Event):
def __init__(self, exception):
def __init__(self, origin, message):
super().__init__('Error')
self.exception = exception
self.origin = origin
self.message = message
def __str__(self):
return str(self.exception)
return self.origin + ': ' + self.message
@property
def exception(self):
def origin(self):
return self._exception
return self._origin
@exception.setter
def exception(self, exception):
@origin.setter
def origin(self, origin):
if not isinstance(exception, Exception):
raise TypeError('exception must be derived from Exception')
if not isinstance(origin, str):
raise TypeError('origin must be a string')
self._exception = exception
self._origin = origin
@property
def message(self):
return self._message
@message.setter
def message(self, message):
if not isinstance(message, str):
raise TypeError('message must be a string')
self._message = message
class TeardownEvent(Event):
@@ -184,8 +198,10 @@ class State:
class ErrorState(State):
def __init__(self, exception, old_state):
def __init__(self, origin, message, old_state):
self.origin = origin
self.message = message
self.old_state = old_state
super().__init__()
@@ -193,6 +209,32 @@ class ErrorState(State):
return 'ErrorState'
@property
def origin(self):
return self._origin
@origin.setter
def origin(self, origin):
if not isinstance(origin, str):
raise TypeError('origin must be a string')
self._origin = origin
@property
def message(self):
return self._message
@message.setter
def message(self, message):
if not isinstance(message, str):
raise TypeError('message must be a string')
self._message = message
@property
def old_state(self):

View File

@@ -135,11 +135,17 @@ class PyQt5Gui(GuiSkeleton):
def showError(self, state):
logging.error('%s: %s', state.title, state.message)
logging.error('%s: %s', state.origin, state.message)
MessageBox(self, MessageBox.RETRY, state.title, state.message,
lambda: self._comm.send(Workers.MASTER, GuiEvent('retry')),
lambda: self._comm.send(Workers.MASTER, GuiEvent('abort')))
reply = QtWidgets.QMessageBox.critical(
self._gui, state.origin, 'Error: ' + state.message,
QtWidgets.QMessageBox.Retry | QtWidgets.QMessageBox.Cancel,
QtWidgets.QMessageBox.Cancel)
if reply == QtWidgets.QMessageBox.Retry:
self._comm.send(Workers.MASTER, GuiEvent('retry'))
else:
self._comm.send(Workers.MASTER, GuiEvent('abort'))
def showWelcome(self, state):
@@ -287,69 +293,3 @@ class PyQt5MainWindow(QtWidgets.QMainWindow):
def keyPressEvent(self, event):
self._handle_key(event)
class MessageBox(QtWidgets.QWidget):
QUESTION = 1
RETRY = 2
INFORMATION = 3
def __init__(self, parent, type, title, message, *handles):
super().__init__(parent)
if type == MessageBox.QUESTION:
self.question(title, message, *handles)
elif type == MessageBox.RETRY:
self.retry(title, message, *handles)
else:
raise ValueError('Unknown type specified')
def question(self, title, message, *handles):
lbl_title = QtWidgets.QLabel(title)
lbl_title.setObjectName('title')
lbl_message = QtWidgets.QLabel(message)
lbl_message.setObjectName('message')
btn_yes = QtWidgets.QPushButton('Yes')
btn_yes.clicked.connect(handles[0])
btn_no = QtWidgets.QPushButton('No')
btn_no.clicked.connect(handles[1])
lay_buttons = QtWidgets.QHBoxLayout()
lay_buttons.addWidget(btn_yes)
lay_buttons.addWidget(btn_no)
layout = QtWidgets.QVBoxLayout()
layout.addWidget(lbl_title)
layout.addWidget(lbl_message)
layout.addLayout(lay_buttons)
self.setLayout(layout)
def retry(self, title, message, *handles):
lbl_title = QtWidgets.QLabel(title)
lbl_title.setObjectName('title')
lbl_message = QtWidgets.QLabel(message)
lbl_message.setObjectName('message')
btn_retry = QtWidgets.QPushButton('Retry')
btn_retry.clicked.connect(handles[0])
btn_cancel = QtWidgets.QPushButton('Cancel')
btn_cancel.clicked.connect(handles[1])
lay_buttons = QtWidgets.QHBoxLayout()
lay_buttons.addWidget(btn_retry)
lay_buttons.addWidget(btn_cancel)
layout = QtWidgets.QVBoxLayout()
layout.addWidget(lbl_title)
layout.addWidget(lbl_message)
layout.addLayout(lay_buttons)
self.setLayout(layout)

View File

@@ -57,7 +57,7 @@ class CameraProcess(mp.Process):
if cap.run():
break
except Exception as e:
self._comm.send(Workers.MASTER, ErrorEvent(e))
self._comm.send(Workers.MASTER, ErrorEvent('Camera', str(e)))
class WorkerProcess(mp.Process):
@@ -77,7 +77,7 @@ class WorkerProcess(mp.Process):
if Worker(self.cfg, self.comm).run():
break
except Exception as e:
self._comm.send(Workers.MASTER, ErrorEvent(e))
self._comm.send(Workers.MASTER, ErrorEvent('Worker', str(e)))
class GuiProcess(mp.Process):