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