2013-01-15 4 views
1
def set_attribute(attributes, name, value): 
    for i, attribute in enumerate(attributes): 
     if name in attribute: 
      quote_char = attribute.find('"') 
      if quote_char == -1: 
       raise ValueError 
       return None 
      attributes[i] = attribute[:quote_char+1] + str(value) + '"' 
      return attributes 

저는 새로운 프로그래머이며 예외 처리를 올바르게 이해하려고합니다. 이 예제 모든 name에서 파이썬에서 예외 발생시 범위 이해

도 어딘가에서 " 문자를해야한다, 그래서 나는이 실패 할 경우 예외를 발생하고 싶지만, 나는 또한 return None 문이 필요한 경우 이해하려고 노력 (또는 아무것도하지)했다.

필자는 예외 처리기가 발견 될 때까지 각 범위의 수준에서 벗어날 것이라고 생각했습니다.

  • 첫째, 시도 절 (키워드 시도 사이 제외하고는 문 (들)) 실행 다음 Python tutorial이 말했다.
  • 예외가 발생하지 않으면 except 절이 생략되고 try 문의 실행이 완료됩니다.
  • try 절 실행 중에 예외가 발생하면 나머지 절이 생략됩니다. 그런 다음 해당 키워드가 except 키워드 뒤에 이라는 예외와 일치하면 except 절이 실행되고 try 문 다음에 실행이 계속됩니다.
  • try 절 실행 중에 예외가 발생하면 나머지 절이 생략됩니다. 그런 다음 해당 키워드가 except 키워드 뒤에 이라는 예외와 일치하면 except 절이 실행되고 try 문 다음에 실행이 계속됩니다.
  • except 절에 명명 된 예외와 일치하지 않는 예외가 발생하면 외부 try 문으로 전달됩니다. 처리기를 찾지 못하면 처리되지 않은 예외이며 위와 같이 메시지가 과 함께 실행이 중지됩니다.

는하지만,이 설명을 읽은 후, 나는 I don't understand exceptions, but I should 실현하고있다.

간단히 말하면 다음과 같습니다. return None 문이 필요하며 이유는 무엇입니까? 또한 예외가 어떻게 작동하는지에 대한 잘못된 점은 무엇입니까?

답변

3

return None은 쓰레기입니다. 파이썬은 결코 거기에 도달하지 못할 것입니다.


당신은 코드를 단순화하고 값 FOO 이제까지 반환됩니다 있는지 확인하기 위해 약간의 실험을 실행할 수

: 실제로 그 라인을 FOO이 생성 될 경우

def foo(): 
    if True: 
     raise ValueError('Bad value') 
     return 'FOO' 
    return 'BAR' 

try: 
    print(foo()) 
except ValueError as err: 
    print(err) 
    # Bad value 

, 당신이 print(foo())에서 볼 수 있지만, 아무것도 인쇄하지 않습니다. 대신 Bad value이 표시됩니다.

+0

예외 처리기가 루트 수준에 있기 때문에 이것은 나에게 의미가 있습니다. 임의로 깊게 중첩 된 함수에 동일한 개념을 적용 할 수 있으며 루트에서 예외가 있으며 여전히 루트에서 처리됩니다. 그렇다면, 제가 제공 한 링크에서 어떤 주장이 나오는지 알고 있습니까? –

+0

죄송합니다. 그 기사에 대해 충분히 언급 할 수 없다. 필자는 이것이 라켓 프로그래머의 관점에서 작성된 것으로 생각하며 그 주요 목적은 라켓에서 파이썬의'try..except..finally' 행동을 구현하는 것입니다. 라켓을 알지 못해서, 그 기사의 대부분이 내 머리 위로 간다. 'try..except ..마침내 시작의 예는 이해할 수있는 물건입니다! :) – unutbu

+0

도움 주셔서 감사합니다. 그래서 본질적으로 나는 마침내 어떻게 작동하는지 연구해야 할 필요가 있습니다. –