Domanda

I have a project that is GUI based. I want to distant it into the code itself and the GUI part.

This is my code: 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

Now, at the GUI part, I just call the function within a try-except block:

    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)

In the current design, the checks stop at the first warning/exception. Of course, an exception should stop the code, but a warning should only show a message to the user and continue afterwards. How can I design it that way?

È stato utile?

Soluzione 2

Even though python offers a warning mechanism, I find it easier to do it that way:

  1. Subclass warnings with the Warning class.
  2. Use a _warnings list and append all warnings to it.
  3. return _warnings and handle it at the external code:

    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
    

Altri suggerimenti

Perhaps you should check out Python's warning mechanism.

It should allow you to warn the user of a dangerous situation without stopping the program.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top