6
0

errorable.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #!/usr/bin/env python
  2. """errorable: Base class for classes with error state."""
  3. import logging
  4. import sys
  5. class Errorable:
  6. def __init__(self):
  7. self._update_ui_fn = lambda: None
  8. self._last_error = None
  9. self._err_children = []
  10. def reset_error(self):
  11. self.last_error = None
  12. def get_last_error(self):
  13. errors = ""
  14. for child in self._err_children:
  15. if child.last_error is not None:
  16. if len(errors) > 0:
  17. errors += ", %s" % child.last_error
  18. else:
  19. errors += "%s" % child.last_error
  20. if self._last_error is not None:
  21. if len(errors) > 0:
  22. errors += ", %s" % self._last_error
  23. else:
  24. errors += "%s" % self._last_error
  25. if len(errors) == 0:
  26. return None
  27. else:
  28. return errors
  29. def set_last_error(self, error):
  30. self._last_error = error
  31. if error is None:
  32. for child in self._err_children:
  33. child.last_error = None
  34. last_error = property(get_last_error, set_last_error)
  35. def _report_error(self, error=None):
  36. if error is None:
  37. error_str = 'General error'
  38. else:
  39. error_str = str(error)
  40. self.last_error = error_str
  41. # (1) Get exception info (if any)
  42. t = sys.exc_info()[0]
  43. v = sys.exc_info()[1]
  44. # (2) Get calling stack frame
  45. try:
  46. caller = str(sys._getframe(1).f_code.co_name)
  47. except:
  48. caller = "Unknown"
  49. logging.error("Error in %s" % caller)
  50. logging.error(str(error))
  51. if t is not None:
  52. logging.error("Underlying: %s, %s" % (t, v))
  53. self._update_ui_fn()