commit 406217a4c58cc24441b2543488506e93bde9c29f
parent 52fca33e30d417d99aedf0c6842e900feaef817f
Author: luke8086 <55237178+luke8086@users.noreply.github.com>
Date: Fri, 5 Aug 2022 13:58:46 +0000
Improve exiting / error handling
Diffstat:
1 file changed, 26 insertions(+), 9 deletions(-)
diff --git a/retronews.py b/retronews.py
@@ -145,6 +145,17 @@ DB = NewType("DB", "sqlite3.Connection")
T = TypeVar("T")
+class ExitException(Exception):
+ code: int
+ message: str
+
+ def __init__(self, code: int = 0, message: str = ""):
+ self.code = code
+ self.message = message
+
+ super().__init__(message)
+
+
@dataclasses.dataclass(frozen=True)
class Group:
provider: str
@@ -376,9 +387,8 @@ def list_get(lst, index, default=None):
return lst[index] if 0 <= index < len(lst) else default
-def cmd_quit(app: AppState):
- app.db.close()
- sys.exit(0)
+def cmd_quit(_: AppState):
+ raise ExitException()
def cmd_help(app: AppState):
@@ -849,7 +859,7 @@ def app_load_messages(
def app_load_group(app: AppState, group: Group) -> None:
- fn = partial(group_fetch_threads, group, db)
+ fn = partial(group_fetch_threads, group, app.db)
flash = f"Fetching stories from '{group.label}' (page {group.page})..."
if (messages := app_safe_run(app, fn, flash=flash)) is None:
@@ -889,7 +899,7 @@ def app_update_layout(app: AppState) -> None:
(lt.lines, lt.cols) = app.screen.getmaxyx()
if lt.lines < 25 or lt.cols < 80:
- raise Exception("At least 80x25 terminal is required")
+ raise ExitException(1, "At least 80x25 terminal is required")
max_index_height = lt.lines - 3
lt.index_height = (max_index_height // 3) if app.pager_visible else max_index_height
@@ -1101,7 +1111,7 @@ def app_init(screen: Window, db: DB) -> AppState:
return app
-def app_main(screen: Window, db: DB) -> None:
+def app_main(screen: Window, db: DB) -> int:
app = app_init(screen, db)
while True:
@@ -1131,6 +1141,13 @@ if __name__ == "__main__":
setup_logging(args.logfile)
- db = db_init(args.db)
-
- curses.wrapper(app_main, db)
+ try:
+ db = db_init(args.db)
+ ret = curses.wrapper(app_main, db)
+ except ExitException as e:
+ if e.message:
+ sys.stderr.write(e.message + "\n")
+ ret = e.code
+ finally:
+ db.close()
+ sys.exit(ret)