2012-01-11 5 views
1

파이썬 자습서 states:처리 예외

그 ...하려고 문 이 존재하는 모든 조항을 제외하고 따라야합니다, 옵션 다른 절을 가지고 제외. 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 절의 사용은 그 실수에 의해 보호되는 코드에 의해 제기되지 않은 예외 을 잡기 피한다 때문에 시도 절에 추가 코드 를 추가하는 것보다 더 나은

시도하십시오 ... 명세서 제외.

질문 1> 위의 문서를 읽은 후, 나는 아직도 우리는 단순히 시도 절다른 절의 코드를 이동할 수 없습니다 왜 생각하지 않습니다.

모든 캐치 오른쪽 절 제외 에서 수행되기 때문에 2이> 어떻게 시도 절 실수로 예외를 잡을 수 않는 질문? 당신이 시도 절에 코드를 이동하면 두 질문에 대한

답변

2

대답은 다음 예외가 어디에서 오는에서 확신 할 수 없다,

, 유사합니다. 따라서 예기치 않은 IOError를 생성하는 또 다른 코드 행이있는 경우 문제가없는 부분을 찾을 수 있습니다.

코드를 더 잘 파기하려면 가능하면 가능한 한 캐치를 만들기 위해 가능한 한 줄을 단순화하고 싶습니다.

6

코드 elsetry 제품군에 넣을 수는 있지만 예외가있을 수 있습니다. 그렇게하기를 원하지 않는다면, 그것은 우발적 인 것이며, 따라서 귀하가 링크 한 문서의 표현입니다.

try 블록에 가능한 한 적은 코드를 넣는 것이 가장 좋습니다. 따라서 오류가 발생하면 어떤 동작으로 인해 문제가 발생했는지 알게되고 적절하게 처리 할 수 ​​있습니다. try 블록에 다섯 줄의 코드가 있고 그 중 하나만 예외를 발생시킬 것으로 예상하는 경우, 예상치 못한 줄에서 예외가 발생하면 예외 처리 코드가 준비되지 않습니다. 이 경우 예외를 처리하는 것보다 예외가 발생하도록하는 것이 좋습니다.

3

당신이 에 그렇지 않으면 의 코드를 이동하면 다음 그 예외를 발생시킬 수있는 "중요한 경로"의 일부가보십시오. f.readlines()이 일종의 예외를 발생시키는 경우 (디스크의 불량 섹터로 인해 파일을 읽는 중 입/출력 오류가 발생할 수 있음), 그 오류는 현재 catch하고있는 오류 하나와 충돌합니다. (기술적으로 "열 수 없습니다"라는 오류 메시지는 그 시점에서 잘못 될 것입니다 ... 파일을 여는 것은 나중에 실패 할 때 성공할 수 있기 때문에 실제로 처리하는 동안 I/O 오류가 발생하기 전에 여는 것이 성공해야합니다) .일반적으로

더 같은 패턴을 사용하십시오 :

foo = None 
try: 
    # some code to access/load/initialize foo from an external source 
except ...: 
    # handle various types of file open/read, database access, etc errors 
else: 
    foo = something 

... 당신은 무엇에 불가능의 주위에 연속적으로 코드를 실행하고 단순히 푸 없음없는 경우 확인하고 사용하거나 작동 할 수 있도록 당신이보기에 적합합니다.

1

1) 물론 else 절의 코드를 try 절로 옮길 수 있습니다. try 블록 외부로 옮길 수는 있지만 유연성과 코드의 추가 조정이 가능합니다. 또한, 잡히는 오류에 대한 특이성. 일어날 가능성이있을 수있는 여러 가지 예외의 전체로드를 나열 할 수 있습니다. 각각 다른 진술을 사용합니다. else 절의 내용은 try 블록에서 마지막 줄을 실행 한 후에 예외가 발생하지 않은 경우에만 발생합니다. 예 : 성공적인 리턴 메세지를 인쇄합니다. 또한 try 절은 가비지 수집 관리 및 오류 추적과 관련하여 추가 CPU 오버 헤드를 추가하므로 try 절 외부의 모든 항목이 동일한 방식으로 보호되지 않으며 더 효율적으로 실행될 수 있습니다.

2) 오류 잡기는 매우 구체적입니다. 예 : 위 예제의 except 절은 f = open(arg,'r') 행을 실행할 때 IOError가 발생하는 경우에만 실행됩니다. 어떤 형태의 예외라도 잡으려면 except Exception:을 사용하십시오.