2017-10-10 32 views
1

파이썬에서 초보자이고 오류를 처리하려고하는데 파이썬에서 오류를 처리하는 가장 효율적인 방법을 모르겠습니다. 나는이 방법을 시도했다. 그러나 이해하는 것은 약간 복잡하게 보인다. 나는 다른 "더 나은"방식으로 그것을 처리 할 수 ​​있다고 생각합니다.파이썬에서 오류를 처리하는 가장 효율적인 방법은 무엇입니까?

def set_bit(value, pos, nbits): 
""" 
Set bit at position. 

Keyword Arguments 
    value (int) 
     Bitstring value. 
    pos (int) 
     Position to set bit. 
    nbits (int) 
     Number of bits. 
""" 
if isinstance(value, int): 
    if value > -1: 
     # Positives only 
     if isinstance(pos, int): 
      if pos > -1: 
       if isinstance(nbits, int): 
        if nbits > -1: 
         return get_bistring(value | 2 ** (pos % nbits), nbits) 
        else: 
         raise ValueError(
          '"nbits" was set {}, but it must be positive only' 
          .format(nbits) 
         ) 
       else: 
        raise TypeError(
         '"nbits" was set {}, but it must be int only' 
         .format(type(nbits)) 
        ) 
      else: 
       raise ValueError(
        '"pos" was set {}, but it must be positive only' 
        .format(pos) 
       ) 
     else: 
      raise TypeError(
       '"pos" was set {}, but it must be int only' 
       .format(type(pos)) 
      ) 
    else: 
     raise ValueError(
      '"value" was set {}, but it must be positive only' 
      .format(value) 
     ) 
else: 
    raise TypeError(
     '"value" was set {}, but it must be int only' 
     .format(type(value)) 
    ) 
+1

대신에 'try else'와 같이 실행하십시오. – 0TTT0

답변

2

당신은 당신의 코드를 단순화하는 논리 전환이

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 
2

처럼 쓰기를 시도 할 수 있습니다 : 자동 기능의 나머지 부분의 실행을 취소합니다

def set_bit(value, pos, nbits): 
    """ 
    Set bit at position. 

    Keyword Arguments 
     value (int) 
      Bitstring value. 
     pos (int) 
      Position to set bit. 
     nbits (int) 
      Number of bits. 
    """ 
    if not isinstance(value, int): 
     raise TypeError('"value" was set {}, but it must be int only'.format(type(value))) 
    if value < 0: 
     raise ValueError('"value" was set {}, but it must be positive only'.format(value)) 
    if not isinstance(pos, int): 
     raise TypeError('"pos" was set {}, but it must be int only'.format(type(pos))) 
    # and so on... 

    # once you finish all your checks, then do what you planned to do 

raise 이후를 조건부 인상 후 오는 모든 코드는 조건이 적용되지 않았다고 가정 할 수 있으므로 else 문은 필요하지 않습니다.

+0

erros를 처리 할 때 try-catch 구문이 더 힘들지 않았습니까? if-else 문이 이것에 대한 "최상의"옵션이 아닌 것 같습니다. –

+0

@ ÁtilaDiasdaGamaeSilva 제목에 'handle'이라는 단어가 있음에도 불구하고, 쓰여진 질문은 예외를 발생시키는 것이지 잡는 것이 아닙니다. – Amber