2017-06-05 8 views
0

私はPythonスクリプトから次のコード部分を持っています。Pythonスクリプトのexcept節にUnboundLocalErrorが表示されるのはなぜですか?

status = 'success' 
try: 
sqlContext.sql("create table {}.`{}` as select * from mytempTable".format(hivedb,table)) 
except Exception as e: 
    #traceback.print_exc() 
    error_message = e 
# print str(e) 
    status = 'fail' 
print ("{},{},{},{}".format(hivedb,table,status,error_message)) 
sys.exit(1) 

exceptionがある場合、ここでのコードのこの部分では、私はerror_messageを設定しています。

エラーがなければ、UnboundLocalError: local variable 'e' referenced before assignmentと表示されます。

エラーがなければerror_messageNo errorに設定します。

どうすれば実現できますか?

+1

'status = 'success''の下に' e =' No error''を入れてください。次にtry/exceptの前に定義されます。しかし、なぜこの種のセットアップが必要なのか分かりません。 – roganjosh

答えて

1

このためクリーナーアプローチは、状態の更新はアトミックでなければなりませんから、elseを使用することです。サイドノートとして

try: 
    sqlContext.sql("create table {}.`{}` as select * from mytempTable".format(hivedb,table)) 
except Exception as e: 
    status = 'fail' 
    error_message = e 
else: # Executes only if no Exception. 
    status = 'success' 
    error_message = 'No error' 

、それはexcept Exceptionとブランケット例外を引くを行うには悪い考えです。例外のタイプを指定するか、KeyboardInterruptSystemExitのように他のものを捕まえる危険があります。

2

あなたはstatusのために、すでに持っているようにtry/catchブロックの前にerror_messageを定義する必要があります。

status = 'success' 
error_message = 'No error' 
try: 
    sqlContext.sql("create table {}.`{}` as select * from mytempTable".format(hivedb,table)) 
except Exception as e: 
    error_message = e 
    status = 'fail' 
+1

'try'ステートメントに関連するスコープがないので、単に' e = 'No error''を設定し、 'error_message'を省略することもできます。 'e'は、' try'ステートメントが完了した後で捕捉された例外にバインドされます。 (とにかくPython 2では、とにかく、 'e'は実際には' except'節の本体のスコープ内にしかありません。) – chepner

+0

@MrJLP私は望みの結果を得ましたが、全体的なスクリプトは私に間違った結果を与えています。 –

+0

@mtjlpスクリプトで私の最初のコードの後に​​追加されたコードを見てください –

関連する問題