2011-11-14 4 views
2

이 코드 조각을 설명하고,이 코드 조각 이해하는 도움이 필요 시겠어요 :당신은 내가 파이썬에 새로운 브랜드 해요 파이썬

for c in [B, C, D]: 
    try: 
     raise c() 
    except D: 
     print "D" 
    except C: 
     print "C" 
    except B: 
     print "B" 

읽기 파이썬 문서, raise() 예외를 throw 것 같다,하지만 내가 할 수있는 raise()try 블록 내에있는 이유를 파악하지 못했습니다. 다음과 같이하면 안됩니다.

try: 
    //do something 
catch: 
    raise() 
+0

코드가 무엇을 달성해야하는지 알지 못하면 어떤 버전이 올바른지를 100 % 알 수 없습니다. –

답변

2

raise 처음에 예외를 발생시키는 방법입니다. 예외 처리기의 외로운 raise은 예외를 외부 처리기에만 전파합니다.

+0

오, 잡았다. 그래서 try 블록 내의 코드는'c'의 값에 따라 예외를 발생시킵니다. – xbonez

+2

'c'에서 예외 클래스의 인스턴스를 발생시키고 있습니다. –

+0

파이썬에서는 모든 것이 객체입니다. 클래스 자체도 마찬가지입니다. 'c'라는 이름은 차례로 각 클래스에 바인딩됩니다. 'c()'는 루프를 통해 매번 상응하는 예외 클래스의 인스턴스를 생성하고, 그 인스턴스는'raise'd됩니다. –

1

그 코드는 일을하는 기이 한 방식이지만 그 일이 아주 명확하다는 점에서 말도 안되는 말입니다. 목록 [B, C, D]은 예외 목록입니다. 예외 raise D는 try 블록이기 때문에, 바로 잇달아 (해당 except 핸들러하여 except B:, except C:except D: 핸들러 처리

따라서,이 코드는 등가이다.

print "B" 
print "C" 
print "D" 
B, C 또는 D 어떤 예외 아닌 경우는 (catch되지 않은) 예외가 발생하는 것을 제외

.

+0

그래, 일종의 말도 안돼. 기본 파이썬 클래스의 일부로, 파이썬에서 예외 처리 개념을 설명하는 것 외에는 아무 것도 얻을 수 없다. – xbonez

2

I)이 (인상을 추정 시도의 내부에 직접 배치되었습니다. 그리고 일반적으로 try 내부에 예외 (즉, raise()가 포함 된 코드)를 발생시키는 코드를 넣을 수도 있습니다. 그렇습니까?

+1

네 말이 맞아. 좀 더 생각한 후에, 예외를 발생시키는 것이'try' 블록 내부에서 의미가 있다는 것을 깨달았습니다. – xbonez

관련 문제