from __future__ import annotations
from dataclasses import dataclass, field
import traceback
TYPE_CHECKING = False
if TYPE_CHECKING:
from threading import Thread
from types import TracebackType
from typing import Protocol
class ExceptHookArgs(Protocol):
@property
def exc_type(self) -> type[BaseException]: ...
@property
def exc_value(self) -> BaseException | None: ...
@property
def exc_traceback(self) -> TracebackType | None: ...
@property
def thread(self) -> Thread | None: ...
class ShowExceptions(Protocol):
def __call__(self) -> int: ...
def add(self, s: str) -> None: ...
from .reader import Reader
def install_threading_hook(reader: Reader) -> None:
import threading
@dataclass
class ExceptHookHandler:
lock: threading.Lock = field(default_factory=threading.Lock)
messages: list[str] = field(default_factory=list)
def show(self) -> int:
count = 0
with self.lock:
if not self.messages:
return 0
reader.restore()
for tb in self.messages:
count += 1
if tb:
print(tb)
self.messages.clear()
reader.scheduled_commands.append("ctrl-c")
reader.prepare()
return count
def add(self, s: str) -> None:
with self.lock:
self.messages.append(s)
def exception(self, args: ExceptHookArgs) -> None:
lines = traceback.format_exception(
args.exc_type,
args.exc_value,
args.exc_traceback,
colorize=reader.can_colorize,
) # type: ignore[call-overload]
pre = f"\nException in {args.thread.name}:\n" if args.thread else "\n"
tb = pre + "".join(lines)
self.add(tb)
def __call__(self) -> int:
return self.show()
handler = ExceptHookHandler()
reader.threading_hook = handler
threading.excepthook = handler.exception
| Name | Type | Size | Permission | Actions |
|---|---|---|---|---|
| __pycache__ | Folder | 0755 |
|
|
| __init__.py | File | 925 B | 0644 |
|
| __main__.py | File | 422 B | 0644 |
|
| _minimal_curses.py | File | 1.8 KB | 0644 |
|
| _threading_handler.py | File | 2.12 KB | 0644 |
|
| base_eventqueue.py | File | 3.75 KB | 0644 |
|
| commands.py | File | 12.01 KB | 0644 |
|
| completing_reader.py | File | 9.81 KB | 0644 |
|
| console.py | File | 6.71 KB | 0644 |
|
| curses.py | File | 1.21 KB | 0644 |
|
| fancy_termios.py | File | 2.51 KB | 0644 |
|
| historical_reader.py | File | 12.93 KB | 0644 |
|
| input.py | File | 3.69 KB | 0644 |
|
| keymap.py | File | 6.31 KB | 0644 |
|
| main.py | File | 1.89 KB | 0644 |
|
| mypy.ini | File | 870 B | 0644 |
|
| pager.py | File | 5.68 KB | 0644 |
|
| reader.py | File | 27.06 KB | 0644 |
|
| readline.py | File | 19.75 KB | 0644 |
|
| simple_interact.py | File | 5.66 KB | 0644 |
|
| trace.py | File | 433 B | 0644 |
|
| types.py | File | 354 B | 0644 |
|
| unix_console.py | File | 26.13 KB | 0644 |
|
| unix_eventqueue.py | File | 2.46 KB | 0644 |
|
| utils.py | File | 2.39 KB | 0644 |
|
| windows_console.py | File | 21.19 KB | 0644 |
|
| windows_eventqueue.py | File | 991 B | 0644 |
|