2016-07-14 5 views
1

나는 보통 예외를 잡는 데 꽤 능숙하지만이 그룹은 나에게 당황 스럽다. 여기에 내가 함께 일하고 있어요 코드 (이 pywinrm 사용)입니다 :여러 예외를 어떻게 잡을 수 있습니까?

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)')) 

내 현재 코드에서 볼 수 있듯이 : 여기

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 

오류 I 받고있어 현재의 단어 구토입니다 , 나는 socket.timeout을 먼저 잡으려고했다. 나는 또한 Exception을 e로 변경하려고 시도했다. catch가 모두 현재 가지고있는 것보다 나을 것이라고 생각했지만 실패했다. requests.exceptions.ConnectTimeout에 대한 예외를 추가하기 위해 transport.py를 편집 해 보았습니다. 그러나이 중 하나를 catch하지는 않습니다.

여러 예외가 발생 했으므로 수행해야 할 특별한 것이 있습니까?

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

첫 번째 질문에 대한 답변 : 여러 예외를 잡는 방법?

할 수 있습니다 단순히 때문에 같은 둥지 예외 :

(. 파이썬 문서 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'

그리고이 같은 파일이 있지만 내용은 다음 두 번째 예외가 발생하지 socket.timeout 오류의 두 번째 문제에 당신을 도울 그러나 ...

을 발생하지 등 될 경우,

except socket.timeout as e: 
     print(e) 

문제를 해결해야 : 당신은 그래서 당신의 코드를 변경 유형 socket.timeout

의 수 있도록 예외를 변경해야합니다 것 같습니다.

관련 문제