2016-05-17 6 views
0

私はPythonを学習しています。ターミナル氏は、定義する前にローカル変数 "data"(行6)を参照していると言っています。エラーをスローする前にローカル変数に到達するPython

なぜこの変数に到達する前にエラーがスローされていないのかわかりません。 connectionがすでに定義されているため、

def querySQL(query,value,tag): 
     try: 
      connection = mdb.connect(servername, username, password, dbname) 
      cursor = connection.cursor() 
      cursor.execute(query,value,tag) 
      data = cursor.fetchall() 

     except mdb.Error, e: 
      print "Error %d: %s" % (e.args[0],e.args[1]) 
      sys.exit(1) 
      return e.args[0] 

     finally: 
      if connection:  
       return data 
       connection.close() 
      else: 
       print "Error %d: %s" % (e.args[0],e.args[1]) 
       sys.exit(1) 
+2

それは 'データ= cursor.fetchallを()'到達する前に、それはエラーを投げています。エラーがスローされたとしても、 'finally' * always *が実行される、つまりその目的であるため、' finally'ブロックはまだ実行されます。 –

+1

また、 'return data'の後に' connection.close() 'を置くことは、関数からすでに返っているので、実際には接続を閉じることはありません。 –

+0

エラーメッセージの対象は、どの行ですか? – Jasper

答えて

0

はおそらくexecute -lineに、スローされた例外があり、そしてcursorへの呼び出しは失敗する可能性が非常に高いではありません。ここで

は、関連するコードです。 finally -blockが常に実行されるため、例外が発生した場合でも元の例外は UnboundLocalErrorによって隠されます。そのため、 finally -blockにクリーンアップコードのみを含めることが重要です。

def querySQL(query,value,tag): 
    try: 
     connection = mdb.connect(servername, username, password, dbname) 
     cursor = connection.cursor() 
     cursor.execute(query,value,tag) 
     data = cursor.fetchall() 
    except mdb.Error, e: 
     print "Error %d: %s" % (e.args[0],e.args[1]) 
     sys.exit(1) 
    finally: 
     if connection: 
      connection.close() 
    return data 

あなたはおそらくリストとしてexecuteの引数を与えたい:

cursor.execute(query, [value, tag]) 
+0

それはうまくいきました。私は、最終目的のブロックを制限することを念頭に置いています。ダニエルありがとう! – kyledewy

+0

補足として、cursor.execute()は4つの引数を与えていると不平を言っています..... value&tagは 'strings'で、query = "INSERT INTOホームページ(クリーム、牛)VALUES(%s、%s ) " – kyledewy

+0

@kyledewy:編集を参照してください。 – Daniel

関連する問題