2010-12-16 3 views
2

私は通常、urllib2例外の処理方法を徹底的に打ち破っています。だから私はまだ学んでいる。ここで私はいくつかのアドバイスをしたいと思うシナリオです。urllib2 couchdbでの例外処理

私はローカルcouchデータベースを持っています。私はデータベースが存在するかどうかを知りたい。すなわち、 "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()を振りかけるのが一般的です。

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の使用

-Update- 。なぜcouchdb-pythonを使用しないのですか?

あなたの質問に答えるには、1)これを行うには特にクリーンな方法ではありません。私は少なくともあなたの例外ブロックのコードを、urrlib2.URLErrorからアプリケーションに適したエラータイプを抽出するメソッドに組み込みます。 2)の場合、sys.exit()をほぼ常に呼び出すのは悪い習慣ではありません。適切な例外を発生させます。デフォルトでは、これはあなたのsys.exit()のようにインタプリタをバブルアップして停止させますが、トレースバックを伴います。または、あなたのCouchクライアントがライブラリであるため、例外はアプリケーションの裁量で処理できます。ライブラリコードは決してインタプリタを終了しません。

+0

アドバイスをいただきありがとうございます。私はcouchdb-pythonバージョンで投稿を更新しました。試行が成功すると、データベースが存在するという考えがあります。ここでの例外処理は理にかなっていますか? – sbartell