[python] 파이썬 try-else

명령문 의 선택적 else절의 의도 된 용도는 무엇입니까 try?



답변

예외가없는 else경우 실행이 맨 아래로 떨어지면 블록 의 명령문 이 실행됩니다 try. 솔직히, 나는 필요를 찾지 못했습니다.

그러나 예외 처리 참고 사항 :

else 절을 ​​사용하면 try … except 문으로 보호되는 코드에 의해 발생하지 않은 예외를 실수로 포착하지 않기 때문에 try 절에 코드를 추가하는 것보다 낫습니다.

따라서 예를 들어을 던질 수있는 메소드가 있고 IOError예외를 포착하려고하지만 첫 번째 작업이 성공 하고 IOError를 포착 하지 않으려 는 경우 다른 작업을 수행하려는 경우 해당 작업을 다음과 같이 작성할 수 있습니다.

try:
    operation_that_can_throw_ioerror()
except IOError:
    handle_the_exception_somehow()
else:
    # we don't want to catch the IOError if it's raised
    another_operation_that_can_throw_ioerror()
finally:
    something_we_always_need_to_do()

그냥 넣으면 another_operation_that_can_throw_ioerror()후에 operation_that_can_throw_ioerror는이 except두 번째 호출의 오류를 잡을 것입니다. 그리고 전체 try블록 뒤에 넣으면 항상 실행되고 finally. 은 else당신이 있는지 확인 할 수 있습니다

  1. 두 번째 작업은 예외가없는 경우에만 실행됩니다.
  2. finally블록 전에 실행 되고
  3. 어떤은 IOError그 인상이 여기 잡힌되지 않습니다에요

답변

하나가 사용에 이유 else스타일과 가독성 -. 일반적으로 코드를 처리하는 코드 근처에 예외를 일으킬 수있는 코드를 유지하는 것이 좋습니다. 예를 들어 다음을 비교하십시오.

try:
    from EasyDialogs import AskPassword
    # 20 other lines
    getpass = AskPassword
except ImportError:
    getpass = default_getpass

try:
    from EasyDialogs import AskPassword
except ImportError:
    getpass = default_getpass
else:
    # 20 other lines
    getpass = AskPassword

두 번째는 except일찍 돌아올 수 없거나 예외를 다시 던질 때 좋습니다. 가능하다면 나는 다음과 같이 썼을 것이다.

try:
    from EasyDialogs import AskPassword
except ImportError:
    getpass = default_getpass
    return False  # or throw Exception('something more descriptive')

# 20 other lines
getpass = AskPassword

참고 : 복사 대답 중복 최근에 게시 여기 따라서이 모든 “AskPassword”물건.


답변

한 가지 용도 : 예외를 제기해야하는 일부 코드를 테스트하십시오.

try:
    this_should_raise_TypeError()
except TypeError:
    pass
except:
    assert False, "Raised the wrong exception type"
else:
    assert False, "Didn't raise any exception"

(이 코드는 실제로보다 일반적인 테스트로 추상화되어야합니다.)


답변

파이썬 try-else

elsetry 문의 선택적 절의 의도 된 용도는 무엇입니까 ?

의도 된 용도는 처리 될 것으로 예상되는 예외가없는 경우 더 많은 코드를 실행할 수있는 컨텍스트를 갖는 것입니다.

이 컨텍스트는 실수로 예기치 않은 오류를 처리하지 않도록합니다.

그러나 때문에, 실행에 다른 절을 유발하는 정확한 조건을 이해하는 것이 중요합니다 return, continue그리고 break에 대한 제어 흐름을 방해 할 수 있습니다 else.

요약하자면

else이없는 경우 문이 실행 에는 예외와에 의해 중단하지 않을 경우 return, continue또는 break문.

다른 답변은 마지막 부분을 놓친 것입니다.

문서에서 :

선택적 else절은 제어 try 절의 에서 흘러 나오는 경우에 실행됩니다 . *

(볼딩이 추가되었습니다.) 그리고 각주는 다음과 같이 읽습니다.

* 현재, 제어 예외 또는 실행의 경우를 제외하고 “끝 흘러” return, continue또는 break문.

하나 이상의 선행 except 절이 필요 합니다 (grammar 참조 ). 따라서 실제로는 “시도하지 않습니다”가 아니라 “시도를 제외하고 (마지막으로)”이며 else(및 finally)는 선택 사항입니다.

파이썬 자습서 의도 된 사용에 정성 들여 :

try … except 문은 선택적인 else 절을 ​​가지며, 존재하는 경우 모든 except 절을 따라야합니다. try 절에서 예외가 발생하지 않으면 실행해야하는 코드에 유용합니다. 예를 들면 다음과 같습니다.

for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except IOError:
        print 'cannot open', arg
    else:
        print arg, 'has', len(f.readlines()), 'lines'
        f.close()

else 절을 ​​사용하면 try … except 문으로 보호되는 코드에 의해 발생하지 않은 예외를 실수로 포착하지 않기 때문에 try 절에 코드를 추가하는 것보다 낫습니다.

블록을 else따르는 코드와 코드의 예try

오류를 처리하면 else블록이 실행되지 않습니다. 예를 들면 다음과 같습니다.

def handle_error():
    try:
        raise RuntimeError('oops!')
    except RuntimeError as error:
        print('handled a RuntimeError, no big deal.')
    else:
        print('if this prints, we had no error!') # won't print!
    print('And now we have left the try block!')  # will print!

그리고 지금,

>>> handle_error()
handled a RuntimeError, no big deal.
And now we have left the try block!


답변

try-except-else는 EAFP 패턴오리 타이핑 을 결합 하는 데 좋습니다 .

try:
  cs = x.cleanupSet
except AttributeError:
  pass
else:
  for v in cs:
    v.cleanup()

이 순진한 코드가 괜찮을 수도 있습니다.

try:
  for v in x.cleanupSet:
    v.clenaup()
except AttributeError:
  pass

이것은 실수로 코드에 심각한 버그를 숨기는 좋은 방법입니다. 정리를 오타했지만 알려주는 AttributeError가 삼키고 있습니다. 더 나쁜 것은, 올바르게 작성했지만 정리 방법에 이름이 잘못 지정된 사용자 유형이 전달되어 중간에 자동으로 실패하고 파일을 닫지 않은 상태로 두는 경우가 있습니다. 그것을 디버깅하는 행운을 빕니다.


답변

예외가있는 경우에도 정리해야 할 때 정말 유용합니다.

try:
    data = something_that_can_go_wrong()
except Exception as e: # yes, I know that's a bad way to do it...
    handle_exception(e)
else:
    do_stuff(data)
finally:
    clean_up()


답변

지금은 그것을 사용할 수는 없지만 그것을 사용해야 할 수도 있습니다. 상상할 수없는 샘플은 다음과 같습니다.

else:

a = [1,2,3]
try:
    something = a[2]
except:
    print "out of bounds"
else:
    print something

없이 else:

try:
    something = a[2]
except:
    print "out of bounds"

if "something" in locals():
    print something

something오류가 발생하지 않으면 변수가 정의됩니다. 이를 try블록 외부에서 제거 할 수 있지만 변수가 정의 된 경우 지저분한 감지가 필요합니다.