def _utest_failure(depth, exp_label, exp, ret_label=None, ret=None, exc=None, subj=None, args=(), kwargs={}): global _utest_failure_count assert subj is not None _utest_failure_count += 1 frame_record = _inspect.stack()[2 + depth] # caller of caller. frame = frame_record[0] info = _inspect.getframeinfo(frame) try: name = subj.__qualname__ except AttributeError: name = str(subj) path = _rel_path(info.filename) if '/' not in path: path = f'./{path}' _errL(f'\n{path}:{info.lineno}: utest failure: {name}') for i, el in enumerate(args): _errL(f' arg {i} = {el!r}') for name, val, in kwargs.items(): _errL(f' arg {name} = {val!r}') _errL(f' expected {exp_label}: {exp!r}') if ret_label: # unexpected value. _errL(f' returned {ret_label}: {ret!r}') if exc is not None: # unexpected exception. _errL(f' raised exception: {exc!r}') for i, arg in enumerate(exc.args): _errL(f' exc arg {i}: {arg!r}') _errL() _print_exception(etype=type(exc), value=exc, tb=exc.__traceback__, file=_stderr) _errL()
def excepthook(args, /): """ Handle uncaught Thread.run() exception. """ if args.exc_type == SystemExit: # silently ignore SystemExit return if _sys is not None and _sys.stderr is not None: stderr = _sys.stderr elif args.thread is not None: stderr = args.thread._stderr if stderr is None: # do nothing if sys.stderr is None and sys.stderr was None # when the thread was created return else: # do nothing if sys.stderr is None and args.thread is None return if args.thread is not None: name = args.thread.name else: name = get_ident() print(f"Exception in thread {name}:", file=stderr, flush=True) _print_exception(args.exc_type, args.exc_value, args.exc_traceback, file=stderr) stderr.flush()
def run(self): try: self.result = self.target(*self.args, **self.kwargs) except: self.result = _exc_info() _print_exception(*self.result)