cmd.Cmds: Support --backtrace

Wrap all execution in try-block, don't raise in except block unless
--backtrace is passed to the command line.

Signed-off-by: Jan Lindemann <jan@janware.com>
This commit is contained in:
Jan Lindemann 2025-05-30 15:53:43 +02:00
commit 5ee88c1a81

View file

@ -67,6 +67,7 @@ class Cmds: # export
formatter_class=argparse.ArgumentDefaultsHelpFormatter, description=self.__description) formatter_class=argparse.ArgumentDefaultsHelpFormatter, description=self.__description)
self.__parser.add_argument('--log-flags', help='Log flags', default=log_flags) self.__parser.add_argument('--log-flags', help='Log flags', default=log_flags)
self.__parser.add_argument('--log-level', help='Log level', default=log_level) self.__parser.add_argument('--log-level', help='Log level', default=log_level)
self.__parser.add_argument('--backtrace', help='Show exception backtraces', action='store_true', default=False)
if self.__modules == None: if self.__modules == None:
self.__modules = [ '__main__' ] self.__modules = [ '__main__' ]
subcmds = set() subcmds = set()
@ -97,6 +98,7 @@ class Cmds: # export
self.args = self.__parser.parse_args(args=argv) self.args = self.__parser.parse_args(args=argv)
set_flags(self.args.log_flags) set_flags(self.args.log_flags)
set_level(self.args.log_level) set_level(self.args.log_level)
self.__back_trace = self.args.backtrace
# This is the toplevel parser, i.e. no func member has been added to the args via # This is the toplevel parser, i.e. no func member has been added to the args via
# #
@ -110,7 +112,17 @@ class Cmds: # export
self.__parser.print_help() self.__parser.print_help()
return None return None
return await self.args.func(self.args) if self.__back_trace:
ret = await self.args.func(self.args)
else:
try:
ret = await self.args.func(self.args)
except Exception as e:
if hasattr(e, 'message'):
slog(ERR, e.message)
else:
slog(ERR, f'Exception: {type(e)}: {e}')
sys.exit(1)
def __del__(self): def __del__(self):
if self.__own_eloop: if self.__own_eloop: