2016-07-14 31 views
1

私は通常例外を捕捉するのにかなり良いですが、このグループは私に困惑しています。ここで私が働いているコードは(それがpywinrmを使用しています)です。ここで複数の例外をどのように捕捉できますか?

import socket 
def win_Upgrade_Check(kbByOS): 
    for os in kbByOS: 
     print(os) 
     try: 
      conn = winrm.Session(os, auth=("administrator","****")) 
      for kb in kbByOS[os]: 
       resp = conn.run_ps("get-hotfix -id {0}".format(kb)) 
       output = resp.std_out.decode('utf-8') 
       error = resp.std_err 
       if error: 
        print("KB{} not found on {}.".format(error,os)) 
       else: 
        print("{} found on {}.".format(kb,os)) 
     except timeout as e: 
      print(e) 
      pass 

は、私が受けていたエラーの現在のワード嘔吐物である:

Traceback (most recent call last): 
    File "/usr/local/lib/python3.5/dist-packages/requests/packages/urllib3/connection.py", line 142, in _new_conn 
(self.host, self.port), self.timeout, **extra_kw) 
    File "/usr/local/lib/python3.5/dist-packages/requests/packages/urllib3/util/connection.py", line 91, in create_connection 
    raise err 
    File "/usr/local/lib/python3.5/dist-packages/requests/packages/urllib3/util/connection.py", line 81, in create_connection 
    sock.connect(sa) 
socket.timeout: timed out 

Traceback (most recent call last): 
    File "/usr/local/lib/python3.5/dist-packages/requests/packages/urllib3/connection.py", line 142, in _new_conn 
(self.host, self.port), self.timeout, **extra_kw) 
    File "/usr/local/lib/python3.5/dist-packages/requests/packages/urllib3/util/connection.py", line 91, in create_connection 
    raise err 
    File "/usr/local/lib/python3.5/dist-packages/requests/packages/urllib3/util/connection.py", line 81, in create_connection 
    sock.connect(sa) 
socket.timeout: timed out 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "/usr/local/lib/python3.5/dist-packages/requests/packages/urllib3/connectionpool.py", line 578, in urlopen 
    chunked=chunked) 
    File "/usr/local/lib/python3.5/dist-packages/requests/packages/urllib3/connectionpool.py", line 362, in _make_request 
    conn.request(method, url, **httplib_request_kw) 
    File "/usr/lib/python3.5/http/client.py", line 1106, in request 
    self._send_request(method, url, body, headers) 
    File "/usr/lib/python3.5/http/client.py", line 1151, in _send_request 
    self.endheaders(body) 
    File "/usr/lib/python3.5/http/client.py", line 1102, in endheaders 
    self._send_output(message_body) 
    File "/usr/lib/python3.5/http/client.py", line 934, in _send_output 
    self.send(msg) 
    File "/usr/lib/python3.5/http/client.py", line 877, in send 
    self.connect() 
    File "/usr/local/lib/python3.5/dist-packages/requests/packages/urllib3/connection.py", line 167, in connect 
    conn = self._new_conn() 
    File "/usr/local/lib/python3.5/dist-packages/requests/packages/urllib3/connection.py", line 147, in _new_conn 
    (self.host, self.timeout)) 
requests.packages.urllib3.exceptions.ConnectTimeoutError: (<requests.packages.urllib3.connection.HTTPConnection object at 0x7fc019afed30>, 'Connection to **** timed out. (connect timeout=30)') 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "/usr/local/lib/python3.5/dist-packages/requests/adapters.py", line 403, in send 
    timeout=timeout 
    File "/usr/local/lib/python3.5/dist-packages/requests/packages/urllib3/connectionpool.py", line 623, in urlopen 
    _stacktrace=sys.exc_info()[2]) 
    File "/usr/local/lib/python3.5/dist-packages/requests/packages/urllib3/util/retry.py", line 281, in increment 
    raise MaxRetryError(_pool, url, error or ResponseError(cause)) 
requests.packages.urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='****', port=5985): Max retries exceeded with url: /wsman (Caused by ConnectTimeoutError(<requests.packages.urllib3.connection.HTTPConnection object at 0x7fc019afed30>, 'Connection to **** timed out. (connect timeout=30)')) 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "bulletin_parse.py", line 258, in <module> 
    win_Upgrade_Check(kbByOS) 
    File "bulletin_parse.py", line 247, in win_Upgrade_Check 
    resp = conn.run_ps("get-hotfix -id {0}".format(kb)) 
    File "/usr/local/lib/python3.5/dist-packages/winrm/__init__.py", line 54, in run_ps 
    rs = self.run_cmd('powershell -encodedcommand {0}'.format(encoded_ps)) 
    File "/usr/local/lib/python3.5/dist-packages/winrm/__init__.py", line 41, in run_cmd 
    shell_id = self.protocol.open_shell() 
    File "/usr/local/lib/python3.5/dist-packages/winrm/protocol.py", line 132, in open_shell 
    res = self.send_message(xmltodict.unparse(req)) 
    File "/usr/local/lib/python3.5/dist-packages/winrm/protocol.py", line 207, in send_message 
    return self.transport.send_message(message) 
    File "/usr/local/lib/python3.5/dist-packages/winrm/transport.py", line 173, in send_message 
    response = self.session.send(prepared_request, timeout=self.read_timeout_sec) 
    File "/usr/local/lib/python3.5/dist-packages/requests/sessions.py", line 585, in send 
    r = adapter.send(request, **kwargs) 
    File "/usr/local/lib/python3.5/dist-packages/requests/adapters.py", line 459, in send 
    raise ConnectTimeout(e, request=request) 
requests.exceptions.ConnectTimeout: HTTPConnectionPool(host='****', port=5985): Max retries exceeded with url: /wsman (Caused by ConnectTimeoutError(<requests.packages.urllib3.connection.HTTPConnection object at 0x7fc019afed30>, 'Connection to **** timed out. (connect timeout=30)')) 

あなたは私の現在のコードで見ることができるように、私は最初にsocket.timeoutをキャッチしようとしました。私は例外としてeを例外として変更しようとしましたが、キャッチはすべて私が現在持っているものよりも良くなると思っていましたが、失敗しました。私は、requests.exceptions.ConnectTimeoutの例外を追加するためにtransport.pyを編集しようとしましたが、これもそれをキャッチしていません。

複数の例外が発生してから行う必要がある特別なことはありますか?

try: 
    doMyFavoriteThing() 
except ValueError: 
    print "Whoops!" 
except timeout: 
    print "Whoopsies!" 
except MaxRetryError: 
    print "Whoopsie daisies!" 
をそれとも、すべての例外が Exceptionクラスのサブクラスであるため、すべての例外をキャッチしたい場合は、これを行うことができます:

答えて

1

必要な数の異なる例外を追加することができます

try: 
    doMyFavoriteThing() 
    except Exception as e: 
     print str(e) 

もちろん、最初のアプローチは一般的にはより良いと考えられています。他の形式でNameErrorsや他の愚かな間違いを捉えるかもしれません。

0

あなたの最初の質問に答えるには:複数の例外をキャッチするにはどうすればよいですか?

ので、同様のことができます。単にネスト例外:(Pythonドキュメントからhttps://docs.python.org/3/tutorial/errors.html#handling-exceptions。)

import sys 

try: 
    f = open('myfile.txt') 
    s = f.readline() 
    i = int(s.strip()) 
except OSError as err: 
    print("OS error: {0}".format(err)) 
except ValueError: 
    print("Could not convert data to an integer.") 
except: 
    print("Unexpected error:", sys.exc_info()[0]) 
    raise 

まず最初の例外がスローされます何'myfile.txt'がない場合。それは次のようになります。IOError [Errno2] No such file or directory: 'myfile.txt'

そして、そこにそのようなファイルがあるが、何のコンテンツが2番目の例外がスローされていないsocket.timeoutエラーのあなたの第二の問題のお手伝いをする。しかしながら

を投げていないし、などする場合は、

except socket.timeout as e: 
     print(e) 

あなたの問題を解決する必要があること:それはあなたがそうするようにコードを変更するタイプsocket.timeout

であるように、あなたの例外を変更する必要があるように見えます。

関連する問題