2015-04-22 4 views
1

Я только что переписал что-то похожее на базовый сервер python (https://docs.python.org/3/library/socketserver.html), потому что я думал, что мне нужно.Python3 - выход из блока try-all try

Мое вопрос, я?

То, что я хотел сделать, - это выйти из обработчика и из цикла сервера, если получен определенный запрос (если требуется, запрос на остановку сервера). Первоначально я попытался вырваться из цикла сервера, выбросив исключение, но получается, что обработчики socketserver запущены внутри блока «try catch all all», что означает, что исключения, брошенные внутри обработчика, выиграли 'никогда не распространяются за пределы функции вызова обработчика (той, которая содержит блок исключения catch-all).

Так что у python есть механизм longjump, который может пробивать блок try-catch_all-expect или я могу запустить serve_forever_loop внутри потока, а затем из обработчика сделать что-то вроде Thread.current.kill() (как я могу это сделать?).

+1

Почему вы не можете подклассы и предоставлять свой собственный 'handle_error'? –

+0

@JohnLaRooy Класс BaseServer не передает ошибку handle_error, просто запрос (уже прочитанный) и client_address https://hg.python.org/cpython/file/3.4/Lib/socketserver.py. Мне нужно было бы вырваться из цикла на определенный тип ошибки (мой пользовательский тип). – PSkocik

ответ

1

Насколько я знаю, нет способа пропускать кадры стека при создании исключения.

Но если вам действительно нужна эта функциональность, вы можете найти другие способы, чтобы одна часть вашего кода отправляла сообщения в другую часть. Если и обработчик, и сервер работают в одном экземпляре интерпретатора (то есть не в отдельных потоках), вы можете заставить обработчик изменить некоторую переменную, доступную для цикла основного сервера, который проверяет цикл сервера. Если вы работаете в разных интерпретаторах, вы можете написать обработчик в файл журнала, который отслеживает цикл сервера. Идея файла журнала является хакерской, но регистрация в любом случае хорошая для серверов.

Смежные вопросы