Разработка проверки работоспособности

У меня есть проект, основанный на графическом интерфейсе. Я хочу разделить его на сам код и часть графического интерфейса.

Это мой код: Main.py:

class NewerVersionWarning(Exception):
    def __init__(self, newest, current=__version__):
        self.newest = newest
        self.current = current
    def __str__(self):
        return "Version v%s is the latest version. You have v%s." % (self.newest, self.current)

class NoResultsException(Exception):
    pass

# ... and so on
def sanity_check():
    "Sanity Check for script."
    try:
        newest_version = WebParser.WebServices.get_newestversion()
        if newest_version > float(__version__):
            raise NewerVersionWarning(newest_version)
    except IOError as e:
        log.error("Could not check for the newest version (%s)" % str(e))

    if utils.get_free_space(config.temp_dir) < 200*1024**2: # 200 MB
        drive = os.path.splitdrive(config.temp_dir)[0]
        raise NoSpaceWarning(drive, utils.get_free_space(config.temp_dir))

# ... and so on

Теперь, в части графического интерфейса, я просто вызываю функцию в блоке try-except:

    try:
        Main.sanity_check()
    except NoSpaceWarning, e:
        s = tr("There are less than 200MB available in drive %s (%.2fMB left). Application may not function properly.") % (e.drive, e.space/1024.0**2)
        log.warning(s)
        QtGui.QMessageBox.warning(self, tr("Warning"), s, QtGui.QMessageBox.Ok)
    except NewerVersionWarning, e:
        log.warning("A new version of iQuality is available (%s)." % e.newest)
        QtGui.QMessageBox.information(self, tr("Information"), tr("A new version of iQuality is available (%s). Updates includes performance enhancements, bug fixes, new features and fixed parsers.<br /><br />You can grab it from the bottom box of the main window, or from the <a href=\"%s\">iQuality website</a>.") % (e.newest, config.website), QtGui.QMessageBox.Ok)

В текущем дизайне проверки останавливаются при первом предупреждении/исключении. Конечно, исключение должно остановить код, но предупреждение должно показывать только сообщение пользователю и продолжаться после этого. Как я могу спроектировать это таким образом?


person iTayb    schedule 04.11.2012    source источник
comment
Одним из простых способов было бы просто не вызывать исключение, если вы сталкиваетесь с предупреждением (добавьте его в список предупреждений или что-то в этом роде). Python использует исключения слишком свободно, IMO, и это заставляет людей использовать исключения, когда доступно более простое решение.   -  person NullUserException    schedule 04.11.2012


Ответы (2)


Возможно, вам следует проверить механизм предупреждений Python.

Он должен позволять предупреждать пользователя об опасной ситуации без остановки программы.

person cha0site    schedule 04.11.2012

Несмотря на то, что python предлагает механизм предупреждения, мне проще сделать это так:

  1. Предупреждения подкласса с классом Warning.
  2. Используйте список _warnings и добавьте к нему все предупреждения.
  3. вернуть _warnings и обработать его во внешнем коде:

    try:
        _warnings = Main.sanity_check()
    except CustomException1, e:
        # handle exception
    except CustomException2, e:
        # handle exception
    
    for w in _warnings:
        if isinstance(w, NoSpaceWarning):
            pass # handle warning
        if isinstance(w, NewerVersionWarning):
            pass # handle warning
    
person iTayb    schedule 04.11.2012