Я вообще не знаю Торнадо, но я посмотрел, и вы просто не можете поймать исключения таким образом. Исключение генерируется в конструкторе _HTTPConnection (), и большая часть кода в этом конструкторе уже заключена в другой контекст стека:
with stack_context.StackContext(self.cleanup):
parsed = urlparse.urlsplit(_unicode(self.request.url))
[...]
Так что, в основном, всякий раз, когда там генерируется исключение (gaierror в вашем примере), оно уже перехватывается и обрабатывается через self.cleanup, что, в свою очередь, генерирует ответ 599 AFAICT:
@contextlib.contextmanager
def cleanup(self):
try:
yield
except Exception, e:
logging.warning("uncaught exception", exc_info=True)
self._run_callback(HTTPResponse(self.request, 599, error=e,
request_time=time.time() - self.start_time,
))
Не уверен, отвечает ли это на ваш вопрос.