Python 3 threading: ошибка потока не отображается в терминале - PullRequest
0 голосов
/ 06 августа 2020

У меня есть этот код:

import socket
import concurrent.futures
import time

HEADERSIZE = 10


def init_server(port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((socket.gethostname(), port))
    s.listen(5)

    with concurrent.futures.ThreadPoolExecutor() as executor:
        executor.submit(init_client, port)
        while True:
            clientsocket, address = s.accept()
            print('server:', address)
            msg = 'Welcome from server: hello client, how are you?'
            msg = f'{len(msg):<{HEADERSIZE}}' + msg
            clientsocket.send(bytes(msg, 'utf-8'))


def init_client(server_port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((socket.gethostname(), server_port))

    time.sleep(3)
    print('client: awake')

    full_msg = ''
    new_msg = True
    while True:
        msg = s.recv(16)
        if new_msg:
            new_msg = False
            msglen = int(msg[:HEADERSIZE])

        raise KeyError('error raised')
        full_msg += msg.decode('utf-8')
        # print('Client: ', full_msg)
        
        if len(full_msg)-HEADERSIZE == msglen:
            print(full_msg[HEADERSIZE:])
            new_msg = True
            full_msg = ''


if __name__ == '__main__':
    PORTS = (10_101, 10_002)
    init_server(PORTS[1])

«stdout» клиентского потока отображается в терминале. Но любая ошибка в потоке (вызванная этим оператором повышения) не отображается в терминале. Как я могу увидеть ошибки в ветке? Могу ли я каким-то образом принудительно отобразить ошибку в выходном терминале (который запускал код)?

Если это имеет значение, я работаю на Ubuntu.

...