2014-02-27 52 views
3

我使用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) 
+0

我已經做了一個快速測試,'>>>試試: ......通過 ...除了: ......通過 ...別的: ...打印 '其他' ...終於: ...打印'終於' ... 其他 終於 '這似乎工作。必須有別的東西。 – njzk2

+0

@ njzk2對,因爲第一個陳述完全按照它應該的方式工作,所以都令人費解。第二條語句的工作原理除了它跳過else塊之外。混亂,特別是對Python(但不是編碼)的新手。 – DeeDee

+0

在這種特殊情況下,爲什麼不把語句放入try塊中。根據http://stackoverflow.com/questions/855759/python-try-else你唯一需要的其他時間是當有異常引發的情況下,你不想被你的除外:在這​​種情況下,否則不需要。 – sabbahillel

回答

2

我覺得沒有定義errors

len(errors)將引發異常,但不能防止finally塊的執行,因此,仍然將一些數據,而不必定義result_response['success']

+0

謝謝:我用else測試了這個:print'in else',錯誤,'out of else'最後:'done'和'in else''已完成'後面跟着NameError錯誤未定義的輸出。 – sabbahillel

+0

錯字在上面的評論,每個字符串應該有一個單獨的打印它是不可遏制的,你可能想要添加一個代碼片段來說明你的觀點。 – sabbahillel

3

如果else塊中引發一個例外,它被忽略,因爲解釋器從該功能執行return。演示:

>>> def divide(x, y): 
...  try: 
...   result = x/y 
...  except ZeroDivisionError: 
...   print "division by zero!" 
...  else: 
...   print "result is", result 
...   print 1/0 
...  finally: 
...   return 1 
... 
>>> divide(2,1) 
result is 2 
1 

1/0不會導致任何回溯。

+0

,它使得'return'和'finally'的使用相當危險,因爲沒有理由如果在except塊中引發異常,結果也不會有任何不同。 – njzk2

+0

這是正確的和有幫助的,謝謝! @ njzk2先發現錯誤,所以我想我必須給他支票。 – DeeDee

相關問題