2016-09-07 3 views
1

나는 놀라지있어 : 내가 기대오류가 발생해도 try-except 절이 실행되지 않습니다. 그런 조금 보였다 코드의 조각을 테스트하는 동안

if x: 
    try: 
      obj = look-for-item-with-id==x in a db 
      if obj is None: 
       # print debug message 
       raise NotFound('No item with this id') 
      return obj 
    except Exception, e: 
     raise Error(e.message) 

을 어떤 항목이 DB에서 제공하는 ID (x)는 거기 없었다 경우 NOTFOUND 예외는 것 제기되다. 대신에 if 절에 도달하여 디버그 메시지를 출력 한 후 except 절에 도달하고 Exception (exc 메시지가 Item not found ...)이 발생합니다. 누군가가 친절하게 여기에 나를 계몽 수 있을까요?

+2

당신은'NotFound'를 들고 그것을 잡아 내고 대신에'Error'를 일으키고 있습니다. 너는 무엇을 기대 했는가? – tzaman

+0

좋아, 이제 알았다. 레이즈는 절을 벗어나지 않고 대신 잡히게됩니다. 수치 스럽네요 :) – fanny

답변

1

항목을 포함하지 해당 블록 내에서 제기하십시오 - 귀하의 NotFound 포함.

NotFound 자체를 전파하려면 더 이상 try/except 블록을 사용할 필요가 없습니다.

NotFound을 발견했지만 동일한 예외가 계속 전파되는 경우 특정 작업을 수행하려는 경우 빈 raise 문을 사용하여 수행중인 것처럼 새 예외를 발생시키지 않고 다시 발생시킬 수 있습니다. 같은 : - 그것은 일반적으로 당신이 예상하지 수있는 오류를 숨길 수있는 모든 것을 잡는다 때문에 except Exception을 사용하는 것이 좋습니다 아니다

try: 
    # .. do stuff 
    if blah: 
    raise NotFound(...) 
except NotFound, e: 
    # print something 
    raise 

또한 내가 except NotFound에 예외 블록을 변경했습니다 있습니다. 기본적으로 except을 사용하여 특정을 처리하는 방법을 알고 있습니다.

+0

나는 그것을 다음과 같이 해결했다 : try : except NotFound : 예외 blah blah를 제외하고 blah blah. 내가 원했던 것은 항목이 발견되었는지 아닌지를 확인하는 것이지, 그렇지 않은 경우 RAISE NotFound에 전달한 다음 제기되지 않은 경우 다른 모든 문제가 있는지 확인하는 것이 었습니다 (예외가 너무 광범위하다는 것을 알고 있습니다. 내 경우 DB 오류). 내 주된 실수는 NotFound를 올리는 것이 NotFound로 발생한다고 생각하는 것이 었습니다. 일종의 "깨는"조항에서 잡히지 않고 오류를 일으키지 않습니다. 나는 예외에 대해 더 많이 읽을 필요가있다. 어쨌든, 나는 당신의 대답을 받아 들일 것입니다 :) – fanny

-1

obj가 길이 또는 항목의 카운트가 0 경우 배열을 확인하십시오 경우이 OBJ없는 것도 의미도 있지만 except Exception, e:을 말할 때, 당신은 명시 적으로 수도 (거의) 어떤 예외를 잡고있다

+0

감사합니다,하지만 obj가 없습니다 ... 나는 그것에 대해 디버깅을했습니다 – fanny

+1

fanny는 'obj가 None :'이 아니라면'if obj :'를 테스트합니다. 그래서 "empty" 목록은 여기에 적용되지 않습니다. –

관련 문제