Why is asyncio ignoring an unhandled exception?

I am working on the integration of tkinter and asyncio. This is so IO blocking coroutine functions can be called from a tkinter GUI. Since tkinter and asyncio must run in separate threads the call from tkinter to the callback must be threadsafe.

I believe the correct function is asyncio.run_coroutine_threadsafe. In the simplified code example below this function calls an exception handler which can deal with IO exceptions. The handler calls the actual callback. Note that the handler is running in the same thread and asyncio loop as the callback.

The problem is that unhandled exceptions are ignored unless the try-except handler includes a bare except clause.

"""intg_test_minimal.py
Created with Python 3.10. Sept 2022
"""
import asyncio
import sys
import threading
import time
import traceback
from typing import Callable, Optional

aio_loop: Optional[asyncio.AbstractEventLoop] = None


class TheSpanishInquisition(Exception):
    """A dummy unexpected exception for development testing."""


async def aio_blocker(block: float = 0.0):
    await asyncio.sleep(block)
    raise TheSpanishInquisition(f'Nobody excepts the Spanish Inquisition.')


async def aio_blocker_controller(func: Callable):
    try:
        await func()
        
    # Handle an expected exception.
    except IOError as exc:
        pass
    
    # # Handle unhandled exceptions!?
    # except:
    #     traceback.print_exception(*(sys.exc_info()))


async def manage_aio_loop(aio_initiate_shutdown: threading.Event):
    global aio_loop
    aio_loop = asyncio.get_running_loop()
    while not aio_initiate_shutdown.is_set():
        await asyncio.sleep(0)


def aio_main(aio_initiate_shutdown: threading.Event):
    asyncio.run(manage_aio_loop(aio_initiate_shutdown))


def main():
    aio_initiate_shutdown = threading.Event()
    aio_thread = threading.Thread(target=aio_main, args=(aio_initiate_shutdown,))
    aio_thread.start()
    
    # Next four lines simulate deleted tkinter code.
    while not aio_loop:
        time.sleep(0)
    asyncio.run_coroutine_threadsafe(aio_blocker_controller(aio_blocker), aio_loop)
    time.sleep(0.2)
    
    aio_initiate_shutdown.set()
    aio_thread.join()
    

if __name__ == '__main__':
    sys.exit(main())