Log threading exceptions properly (#34789)
This commit is contained in:
parent
87801d8aca
commit
0246761f94
3 changed files with 32 additions and 0 deletions
|
@ -249,6 +249,10 @@ def async_enable_logging(
|
|||
logging.getLogger("urllib3").setLevel(logging.WARNING)
|
||||
logging.getLogger("aiohttp.access").setLevel(logging.WARNING)
|
||||
|
||||
sys.excepthook = lambda *args: logging.getLogger(None).exception(
|
||||
"Uncaught exception", exc_info=args # type: ignore
|
||||
)
|
||||
|
||||
# Log errors to a file if we have write access to file or config dir
|
||||
if log_file is None:
|
||||
err_log_path = hass.config.path(ERROR_LOG_FILENAME)
|
||||
|
|
|
@ -71,6 +71,7 @@ from homeassistant.exceptions import (
|
|||
from homeassistant.util import location
|
||||
from homeassistant.util.async_ import fire_coroutine_threadsafe, run_callback_threadsafe
|
||||
import homeassistant.util.dt as dt_util
|
||||
from homeassistant.util.thread import fix_threading_exception_logging
|
||||
from homeassistant.util.unit_system import IMPERIAL_SYSTEM, METRIC_SYSTEM, UnitSystem
|
||||
|
||||
# Typing imports that create a circular dependency
|
||||
|
@ -80,6 +81,7 @@ if TYPE_CHECKING:
|
|||
|
||||
|
||||
block_async_io.enable()
|
||||
fix_threading_exception_logging()
|
||||
|
||||
# pylint: disable=invalid-name
|
||||
T = TypeVar("T")
|
||||
|
|
26
homeassistant/util/thread.py
Normal file
26
homeassistant/util/thread.py
Normal file
|
@ -0,0 +1,26 @@
|
|||
"""Threading util helpers."""
|
||||
import sys
|
||||
import threading
|
||||
from typing import Any
|
||||
|
||||
|
||||
def fix_threading_exception_logging() -> None:
|
||||
"""Fix threads passing uncaught exceptions to our exception hook.
|
||||
|
||||
https://bugs.python.org/issue1230540
|
||||
Fixed in Python 3.8.
|
||||
"""
|
||||
if sys.version_info[:2] >= (3, 8):
|
||||
return
|
||||
|
||||
run_old = threading.Thread.run
|
||||
|
||||
def run(*args: Any, **kwargs: Any) -> None:
|
||||
try:
|
||||
run_old(*args, **kwargs)
|
||||
except (KeyboardInterrupt, SystemExit): # pylint: disable=try-except-raise
|
||||
raise
|
||||
except Exception: # pylint: disable=broad-except
|
||||
sys.excepthook(*sys.exc_info())
|
||||
|
||||
threading.Thread.run = run # type: ignore
|
Loading…
Add table
Reference in a new issue