2011-11-30 2 views
-2

파이썬 (적어도 2.7)이 오류에 대한 예외 처리 메커니즘의 유효성을 검증하지 않는 이유를 알지 못합니다.예외 처리가 라이브러리의 존재를 확인하지 않는 이유

예 : 예외가 처음으로 호출되지 않은 경우 내가 실제로 pymongo lib 디렉토리를 가져했다면이 경우

try: 
    some code selecting data from pymongo 
except pymongo.errors.OperationFailure: 
    exception 

는, 파이썬은 확인하지 않습니다.

왜 그런가?

+2

나는 꽤 질문하지 않습니다. 당신은 이미'수입 pymongo' 어딘가에 있나요? 이 try-except 블록은 무엇을하려고하며 왜 pymongo의 존재를 "검증"해야 하는가? – jsalonen

+0

아니, @kindall은 이미 나를 이해하고 대답했다. 감사합니다 – acheruns

답변

6

질문을 올바르게 읽는다면 아직 pymongo 모듈을 가져 오지 않은 경우 모듈을로드 할 때 except pymongo.errors.OperationFailure에서 오류가 발생하지 않는 이유를 알고 싶습니다.

파이썬에서와 마찬가지로 대부분 except 절에 대한 인수는 런타임에 평가됩니다. 사실, 그들은 표현이 될 수 있습니다! 파이썬은 그 당시 다른 이름의 유효성을 검사하는 것보다 "컴파일"시간에 더 이상 유효성을 검사하지 않습니다.

이유는 파이썬이 동적 언어라는 것입니다. 조건부로 가져 오기를 수행하거나 "컴파일"시간에 알 수없는 이름을 기반으로 수행 할 수 있으며 모듈 및 다른 네임 스페이스는 코드로 대체, 수정 또는 제거 할 수 있습니다. 결과적으로 파이썬은 코드 실행시 해당 코드에서 pymongo.errors.OperationFailure이 유효한 이름인지 알 수 없으므로 코드가입니다. 모든

+4

'pylint'는 동적 언어로 코드의 정적 분석을 할 수있는 정도까지 이러한 종류의 문제를 잡기위한 좋은 도구입니다. – geoffspear

1

PyMongo 설명서에 따르면 pymongo.errors.OperationFailure 예외는 "데이터베이스 작업이 실패 할 때 발생합니다"라고합니다. 따라서 except 블록은 이러한 오류가 발생한 경우에만 평가됩니다. "확인"을하지

try: 
    import pymongo 
except: 
    print("PyMongo not found!") 
    sys.exit(-1) 

이 방법은 종종 폴백 (뒤로 compatibity)를 제공 를 사용하는 수입 :

나는 "pymongo의 존재의 확인"에 의해 당신이 좋아하는 somethine을 참조하고 있으리라 믿고있어. 스크립트의 시작 부분에서, 당신은 이미 import pymongo을 가지고 있다고 가정

try: 
    import simplejson as json 
except ImportError: 
    import json 

을 다음과 같이 json 인코더/디코더의 경우 예를 들어, 우리는 우리가 simplejson 라이브러리를 사용할 수 있는지 여부를 시도 할 수 있습니다 및 대체로 json 라이브러리를 사용 , 나는 pymongo가 수입되었는지 확인하거나 "검증"해야하는 이유를 알지 못합니다. 라이브러리가 발견되지 않으면 을 이미 올릴 것입니다.

1

먼저, pymongo.errors.OperationFailure 어디서나, pymongo 모듈의 일부로서, 또한 같은 파일에 정의 pymongo 개체의 특성의 속성으로뿐만 아니라 정의 할 수 있습니다.

따라서 예외를 처리 할 때 특정 모듈을 가져온 경우 Python이 확인하지 않아야합니다..당신이 그런 일 할 경우

그러나 :

import pymongo 

는 당신이 가져 오기 오류가 실제로 발생 볼을 모듈 발견되지 않는 경우 : 내 대답은 충분하지 않다

Traceback (most recent call last): 
    File "<pyshell#0>", line 1, in <module> 
    import pymongo 
ImportError: No module named pymongo 

경우 코드에 import pymongo 문이 없더라도 처음으로 스크립트를 실행할 때 pymongo.errors.OperationFailure을 포함하면 오류가 발생하지 않는 이유에 대해 자세히 알고 싶습니다. kindall's answer on Python being a dynamic language을 참조하십시오.

관련 문제