2010-12-16 7 views
2

나는 보통 urllib2 예외를 처리하는 방법에 어려움을 겪고있다. 그래서 나는 아직도 배우고있다. 다음은 몇 가지 조언이 필요한 시나리오입니다.coulldb를 사용한 urllib2 예외 처리

나는 로컬 소파 DB 데이터베이스를 가지고 있습니다. 나는 데이터베이스가 있는지 알고 싶다. 즉 "127.0.0.1:5984/database"입니다. 존재하지 않고 "127.0.0.1:5984"에 도달 할 수 있으면 새 데이터베이스를 만들 수 있도록 알고 싶습니다.

1) 내가 타임 아웃을 얻을 수 :

는 여기에 대해 생각하고 몇 가지 경우입니다. "나는 데이터베이스에 도달하지

2) 내 URL이 점에서 잘못은 전적으로 즉, 나는 127.0.4.1:5984/database 입력하지만 CouchDB를가 127.0.0.1:5984

3) 데이터베이스 경로에 데이터베이스 "가 소파 데이터베이스에 없습니다.

그래서 여기에 몇 가지 코드를 나는 그것을 처리하기 위해 쓴 :

은 내가하는 일은 응답을 테스트합니다. 모든 것이 좋으면 db_exists를 True로 설정합니다. db_exists를 False로 설정하는 유일한 경우는 404를 얻는 것입니다. 다른 모든 것은 프로그램을 종료합니다.

request = urllib2.Request(address) 
try: 
    response = urllib2.urlopen(request) 
except urllib2.URLError, e: 
    if hasattr(e, 'reason'): 
     print 'Failed to reach database' 
     print 'Reason: ', e.reason 
     sys.exit() 
    elif hasattr(e, 'code'): 
     if e.code == 404: 
      db_exists = False 
     else: 
      print 'Failed to reach database' 
      print 'Reason: ' + str(e) 
      sys.exit() 
else: 
    try: 
        #I am expecting a json response. So make sure of it. 
     json.loads(response.read()) 
    except: 
     print 'Failed to reach database at "' + address + '"' 
     sys.exit() 
    else: 
     db_exists = True 

나는 URLlib2 The Missing Manual에 배치 된 예외 처리 계획을 따른다.

그러니까 기본적으로 내 질문은 ...

1)이이 처리 할 수있는 깨끗하고 강력한 방법이 있나요?

2) 코드 전체에 sys.exit()를 뿌리는 것이 일반적입니다.

-Update- 사용 CouchDB를-파이썬 :

main(db_url): 
    database = couchdb.Database(url=db_url) 
    try: 
     database.info() 
    except couchdb.http.ResourceNotFound, err: 
     print '"' + db_url + '" ' + err.message[0] + ', ' + err.message[1] 
     return 
    except couchdb.http.Unauthorized, err: 
     print err.message[1] 
     return 
    except couchdb.http.ServerError, err: 
     print err.message 
     return 
    except socket.error, err: 
     print str(err) 
     return 

if __name__ == '__main__': 
    # note that id did not show it here, but db_url comes from an arg. 
    main(db_url) 

답변

1

난 당신이 너무 낮은 수준에서이 문제를 공격하고 있다는 주장 할 것이다. couchdb-python을 사용하지 않으시겠습니까?

귀하의 질문에 답하기 위해 1) 아니요, 그렇게 할 수있는 특별한 방법이 아닙니다. 나는 최소한 urlib2.URLError에서 응용 프로그램에 적합한 오류 유형을 추출하는 메서드로 예외 블록의 코드를 분석합니다. 2)의 경우, sys.exit()를 거의 항상 호출하는 것은 나쁜 습관이 아닙니다. 적절한 예외를 발생시킵니다. 기본적으로 이것은 sys.exit()와 마찬가지로 인터프리터를 버블 링 (pop up)시키고 정지시킨다. 또는 귀하의 Couch 클라이언트가 라이브러리이기 때문에, 예외는 응용 프로그램의 재량에 따라 처리 될 수 있습니다. 라이브러리 코드는 결코 인터프리터를 종료하면 안됩니다.

+0

감사합니다. 게시물을 couchdb-python 버전으로 업데이트했습니다. 아이디어는 try가 성공하면 데이터베이스가 존재한다는 것입니다. 예외 처리가 더 의미가 있습니까? – sbartell