2012-11-17 3 views
12

그래서 try except 문을 작성하는 올바른 방법을 알고 싶습니다. 파이썬에서 오류 처리에 익숙하지 않다.try, except, else를 Python에서 올바르게 사용하는 방법

옵션 1 개

try: 
    itemCode = items["itemCode"] 
    dbObject=db.GqlQuery("SELECT * FROM %s WHERE code=:1" % dbName,itemCode).get() 
    dbObject.delete() 
except AttributeError: 
    print "There's no item with that code" 
except KeyError: 
    print "Bad parameter name" 
except: 
    print "Unknow error" 

옵션 2

try: 
    itemCode = items["itemCode"] 
except KeyError: 
    print "Bad parameter name" 
else:  
    dbObject=db.GqlQuery("SELECT * FROM %s WHERE code=:1" % dbName,itemCode).get() 
    try:  
     dbObject.delete() 
    except AttributeError: 
     print "There's no item with that code" 
    except: 
     print "Unknow error" 

옵션 3 당신이 생각할 수있는 다른 더 나은 옵션을 선택합니다.

옵션 1, try 블록에 모든 코드를 래핑하는 것을 볼 수 있습니다. 옵션 2, 중첩 된 블록을 사용합니다. 특정 행 문에 대한 예외를 발생시킵니다.

어딘가에 오류가 있으면 그것에 대해 기쁘게 생각합니다.

+0

질문을 완전히 이해하지 못했습니다. 당신의 주된 문제는 어떻게 시도해 보느냐, 그렇지 않은지, 마침내 어떻게 작동하는지 이해하는 것입니다. 그 맞습니까? 그렇다면 이것을 설명하는 예제를 제공 할 수 있습니다. – inspectorG4dget

+0

@ inspectorG4dget - 나는 질문이 그들이 어떻게 작동하는지 (두 가지 예 모두 유효하다)와 문체 선호도 질문에 대해 덜 중요하다고 생각한다. –

+0

''try :''블록과''else :''블록에서 오브젝트를 삭제하는 이유를 이해하지 못합니다. 뭔가 빠졌습니까? 그렇지 않습니다. –

답변

-1

대신 KeyError를 잡는 대신 유효성 검사와 함께 dicts 메서드를 사용하는 것이 더 좋습니다.

itemCode = items.get("itemCode") # itemCode will be None, if no such key 
if itemCode is not None: 
    print "code missing" 

"일반적인"해결책이 아닙니다.

첫 번째 경우에는 왜 두 번 삭제하려고하는지 이해할 수 없습니다.

try: 
    itemCode = items.get("itemCode") # itemCode will be None, if no such key 
    if itemCode is not None: 
     print "code missing" 
    dbObject=db.GqlQuery("SELECT * FROM %s WHERE code=:1" % dbName,itemCode).get() 
    dbObject.delete() 
except AttributeError: 
    print "There's no item with that code" 
except StandardError as ex: # good idea to be prepared to handle various fails 
    print "Unexpected error deleting item {}".format(ex) 

또한 파이썬에는 마침내 섹션이 있다는 것을 잊지 마십시오. 그것은 때때로 유용 할 때가 있습니다.

+2

'item [ 'itemCode']'가'0','False','[]','{}'또는''itemCode ''로 평가되는 다른 곳에서 코드가 실패하는 이유는 매우 Python 접근법이 아닙니다. 거짓. 'try' /'except'는 아이템이 발견되지 않은 특정 케이스를 실제로 잡아 내기 때문에이 상황에서 더 선호됩니다. 'itemCode가 아니라면 itemCode'가 발생할 수 있다는 오탐 (false positive)은 없습니다. –

+0

네, 정말 미안 해요, 제 실수입니다. (정말 피곤하고 빨리 대답하려고했습니다). 물론, 'None'이고'is not None'은 값이 None인지 검사 할 때 항상 사용되어야합니다. 코드를 수정했습니다. – cleg

+0

사과하지 않습니다.우리는이 모든 것들을 함께 해결하려고 노력하고 있습니다. :-) 새 코드에서도 'itemCode'가 아닌 항목과 'items ['itemcode ']가'없음 '의 차이점을 알 수 없습니다. 'None'은 저장할 가치가 있으며'None'과'KeyError'는 큰 차이가 있습니다. –

4

python의 선에서 "평면이 중첩 된 것보다 낫습니다." 나는 대체로 # 1 스타일의 스타일로 갈 것이지만, dbObject=db.GqlQuery("SELECT.... 또는 dbObject.delete()AttributeError을 발생시키는 지 조금 혼란 스럽다. 그러나 어떤 경우에도 dbObject.delete() 번을 두 번 이상 호출하지 않아도됩니다.

+0

내 잘못, 나는 이중 삭제를 고쳤다. dbObject.delete()는 AttributeError를 발생시킵니다. –

+0

모든 오류를 잡아서 간단한 "알 수없는 오류"메시지로 숨기는 것은 좋지 않습니다. 이해하기 어렵습니다. 그런 오류 메시지가 나타날 때 어떤 일이 일어 났습니까? – cleg

+0

@cleg 오류에 대해 잘 모르겠습니다. 그들이 올 때 나는 그들을 잡을 것이다 –

0

단순함 - 다릅니다. 어떤 예외 상황을 확신 할 수 있다면 1)을 고수 할 수 있습니다. 솔직히 말하면 90 %의 경우입니다. 두 번째 방법은 많은 코드 루틴이 동일한 예외 유형을 발생시킬 수 있다는 것을 알고 있다면 유용합니다.

관련 문제