2017-07-17 16 views
1

私のプログラムでは、いくつかのホストにいくつかのget要求を出しています。問題は、ホストが切断されたときにスローされる例外を正しくキャッチできないことです。私は竜巻を使用しており、リクエストは非同期です。竜巻で並列非同期リクエストを実行中に例外をキャッチ

self.http_client = AsyncHTTPClient() 

    try: 
     responses = yield [self.http_client.fetch(theUrl) for theUrl in URLS]            
    except Exception as e: 
     if (e[0] == 111) or (e[0] == 599): 
       #Do something 

ホストが切断されると、時々、私は例外をキャッチすることができていますが、それはまだ投げます: は、以下のコードを考えます。私は私のコードで「111」の例外を処理しています、それはまだスローされているという事実にもかかわらず

ERROR:tornado.application:Multiple exceptions in yield list 
Traceback (most recent call last): 
    File "/opt/felix-web-mon/env/lib/python2.7/site-packages/tornado/gen.py", line 828, in callback 
    result_list.append(f.result()) 
    File "/opt/felix-web-mon/env/lib/python2.7/site-packages/tornado/concurrent.py", line 238, in result 
    raise_exc_info(self._exc_info) 
    File "<string>", line 3, in raise_exc_info 
error: [Errno 111] Connection refused 

:私は、例えば、私のログファイルに印刷され、このエラーメッセージが表示されます。私はそれが私がリストの理解を使用しているという事実によると思う(私が必要とする)。 これをキャッチするにはどうすればいいですか?例外ブロック内の複数の例外を利回りリスト 'に挿入しますか?私たちを手伝ってくれますか ?

答えて

1

リストを単純に返すことで、複数の未来を待っている間、すべてのエラーをすべて「破棄」します。

  • WaiterIterator - これは、到着時に結果が得られるという利点があります。 yieldリクエストが完了するまで待っているわけではありません(特に、最も遅いもの)。

を上げる抑制するfetchでパスraise_error=Falseの両方が記載されているが、Exception handling for parallel fetch requestsを見てみましょう。

from tornado.gen import coroutine 
from tornado.ioloop import IOLoop 
from tornado.httpclient import AsyncHTTPClient 

@coroutine 
def main(): 
    URLS = [ 
     'http://amazon.com', 
     'https://www.kernel.org/some404', 
     'http://localhost:8787', # connection refused 
     'http://google.com' 
    ] 
    http_client = AsyncHTTPClient() 

    responses = yield [http_client.fetch(theUrl, raise_error=False) for theUrl in URLS] 
    for idx, r in enumerate(responses): 
     print(URLS[idx]) 
     if 200 <= r.code <= 299: 
      print('> ok') 
     elif 300 <= r.code <= 399: 
      print('> ok - redirect') 
     elif 400 <= r.code <= 499: 
      print('> client err: %s' % r.code) 
     elif 500 <= r.code <= 598: 
      print('> server err: %s' % r.code) 
     elif r.code == 599: 
      print('> 599 connection error or timedouted request') 

     # or something like below 
     #try: 
     # res = r.rethorw() 
     #except Exception: 
      # do something 


IOLoop.instance().run_sync(main) 
関連する問題