我使用Python 2.7.3和Flask 0.10.1和SQL-Alchemy 0.9.1。爲什麼我的`try`塊的`else`部分中的代碼沒有運行?
在我的視圖代碼中,我構建了一個數據庫輸入對象,並且我的代碼依賴於兩個塊的正確執行。它在第一個區塊的預期工作,無論是在發生異常時還是在不發生時。當有例外時,我收到errors
的集合。當沒有異常時,數據將被添加到數據庫中,並且樣本計數器遞增。下面是摘錄:
try:
new_sample = Sample()
new_sample.build(sample)
except SampleBuildingError as e:
result_response['errors'].append('{0}: {1}'.format(sample['sample_name'], e.value))
else:
db.session.add(new_sample)
num_added += 1
視圖功能再往下,我有一個try
/except
/else
/finally
塊。數據正在提交給數據庫,所以try
部分顯然是工作的,finally
塊也是如此。然而,似乎沒有被執行的else
塊:
try:
db.session.commit()
except Exception as e:
result_response['error'] = "Failed on the database input: {0}".format(str(e))
else:
result_response['success'] = "The samples were input to the database successfully. {0} samples entered into the database, with {1} errors".format(num_added, len(errors))
finally:
return jsonify(result_response)
當有一個例外,我得到的JSON回來了,還error
鍵和數據庫錯誤,符合市場預期。但是,當數據庫提交成功時,我得到一個json對象,其中包含除之外的所有預期密鑰success
密鑰。
看來else
塊正在跳過,但我不明白爲什麼。我試着在else塊的第二行放置bogus
這個詞來試圖強制一個錯誤,但是Python不會抱怨!
下面是完整的視圖功能:
@app.route("/kapasubmit", methods=['POST'])
def kapasubmit():
num_added = 0
result_response = {'errors': []}
samples = request.json['data']
for sample in samples:
sample_check = Sample.query.filter_by(sample_name = sample['sample_name']).first()
if sample_check is None:
try:
new_sample = Sample()
new_sample.build(sample)
except SampleBuildingError as e:
result_response['errors'].append('{0}: {1}'.format(sample['sample_name'], e.value))
else:
db.session.add(new_sample)
num_added += 1
else:
result_response['errors'].append('{0}: This is a duplicate sample'.format(sample['sample_name']))
if num_added > 0:
try:
db.session.commit()
except Exception as e:
result_response['error'] = "Failed on the database input: {0}".format(str(e))
else:
result_response['success'] = "The samples were input to the database successfully. {0} samples entered into the database, with {1} errors".format(num_added, len(errors))
bogus
finally:
return jsonify(result_response)
else:
result_response['error'] = "No valid samples submitted for input"
return jsonify(result_response)
我已經做了一個快速測試,'>>>試試: ......通過 ...除了: ......通過 ...別的: ...打印 '其他' ...終於: ...打印'終於' ... 其他 終於 '這似乎工作。必須有別的東西。 – njzk2
@ njzk2對,因爲第一個陳述完全按照它應該的方式工作,所以都令人費解。第二條語句的工作原理除了它跳過else塊之外。混亂,特別是對Python(但不是編碼)的新手。 – DeeDee
在這種特殊情況下,爲什麼不把語句放入try塊中。根據http://stackoverflow.com/questions/855759/python-try-else你唯一需要的其他時間是當有異常引發的情況下,你不想被你的除外:在這種情況下,否則不需要。 – sabbahillel