Разработайте проверку работоспособности
У меня есть проект на основе графического интерфейса. Я хочу дистанцировать это в сам код и часть GUI.
Это мой код: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-exc:
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)
В текущем проекте проверки останавливаются при первом предупреждении / исключении. Конечно, исключение должно остановить код, но предупреждение должно показывать только сообщение пользователю и продолжаться после него. Как я могу создать это таким образом?
2 ответа
Несмотря на то, что python предлагает механизм предупреждения, мне проще сделать это следующим образом:
- Предупреждения подкласса с
Warning
учебный класс. - Использовать
_warnings
перечислить и добавить все предупреждения к нему. вернуть
_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
Возможно, вам следует проверить механизм предупреждения Python.
Это должно позволить вам предупредить пользователя об опасной ситуации, не останавливая программу.