2016-01-27 47 views
0

我有兩個可能的錯誤,我可以在我的用例中得到:'RSA key format is not supported'不正確的密碼和'PEM encryption format not supported.'所需的密碼但沒有給出。這些都是ValueError類型。捕捉異常和處理除:if語句

我試圖做到這一點的嘗試 - 除了

from flask import Flask, url_for, request, json, jsonify 
from Crypto.PublicKey import RSA 

app = Flask(__name__) 

@app.route('/key2pub', methods = ['POST']) 
def api_keypub(): 
    if request.headers['Content-Type'] == 'application/json': 

     resp = None 
     try: 
      pubkey = RSA.importKey(request.json['key'], request.json['passphrase']) 
     except ValueError as e: 
      if e == 'RSA key format is not supported': 
       global resp 
       resp = jsonify({"error": "Incorrect passphrase", "raw": e}) 
      elif e == 'PEM encryption format not supported.': 
       global resp 
       resp = jsonify({"error": "Passphrase missing", "raw": e}) 

     return resp 

if __name__ == '__main__': 
    app.run(debug=True); 

,我發現了錯誤:

... 
ValueError: View function did not return a response 

如此看來,resp是沒有得到的設置,除非聲明。

我懷疑我正在使用try-except以錯誤的方式,有人可以告訴我正確的方法來做到這一點嗎?

+0

您的if語句不在您的except語句中。如果這是一個錯字,然後打印'e'並確保它返回正確的字符串 – SirParselot

+0

是的,這是SO上的拼寫錯誤,它在我的代碼中正確縮進。 – Dru

+0

如果內容類型不是「application/json」,會返回什麼內容? –

回答

2

你寫信給global resp,而你實際上有本地信息。因此global resp將被設置,但您的本地resp設置爲None將不會更改,因此您將返回None。所以如果你刪除global resp聲明它應該正常工作。也許還可以設置一個默認的resp,以防其另一個錯誤,你會錯過。因此,類似以下內容

resp = None 
    try: 
     pubkey = RSA.importKey(request.json['key'], request.json['passphrase']) 
    except ValueError as e: 
     if str(e) == 'RSA key format is not supported': 
      resp = jsonify({"error": "Incorrect passphrase", "raw": str(e)}) 
     elif str(e) == 'PEM encryption format not supported.': 
      resp = jsonify({"error": "Passphrase missing", "raw": str(e)}) 
     else: 
      resp = jsonify({"error": "Unexpected error", "raw": str(e)}) 

    return resp 
+0

感謝您澄清全球範圍。我需要那個。我還必須將'e'與'str(e)'串起來。 – Dru

+0

在'if e ...'缺少str()。我不能編輯少於4個字符 – Dru

+0

@Dru只是修復它 –

-1

api_keypub是這裏最內層的環境:resp是該環境的本地環境。使用全球不會幫助。

最重要的是,你需要縮進如果語句是的一部分,除了條款。