現在、例外をキャッチするコードを作成しようとしていますが、どの例外がスローされたかによって、例外がスローされなかった場合とは異なるモジュールがインポートされます。
try:
import sge_execution_engine as execution_engine
except ImportError:
print "Use local execution engine because SGE support is missing!"
print sys.exc_info() # Print out the exception message
import local_execution_engine as execution_engine
except RuntimeError:
print "Using local execution engine because SGE support is missing!"
print sys.exc_info()
import local_execution_engine as execution_engine
キャッチされる最初の例外は、の実行中に python モジュールが見つからないImportError
場合にスローされる例外をキャッチします(内部にステートメントがあります)。2 番目の例外 は、 python ライブラリが見つかったときにキャッチされますが (同様に、内のステートメントの実行中)、C ライブラリは OS にインストールされません。Pythonライブラリ、C ライブラリ、または Sun Grid Engine がインストールされていないマシンでユーザーがこのモジュールを実行しようとしたときにスローされる可能性のあるすべての例外を、これら 2 つのステートメントで十分に捕捉できることを願っています。これらの進行がなければ、モジュールは次に進みます。drmaa
import sge_execution_engine
sge_execution_engine
import drmaa
RuntimeError
drmaa
import drmaa
sge_execution_engine
drmaa
except
drmaa
drmaa
import local_execution_engine
そのため、コードはユーザーのマシンでローカルに実行できます。現在、コードは sge で例外が見つかったときにローカルをインポートするという意味で期待どおりに機能しますが、ここでの例外処理を改善してより堅牢にすることを引き続き検討しています。
私の意見では、スローされた実際の例外メッセージを stdout に出力することは良いことだと思います。特に、インポートに失敗することを予期していなかった場合に、sge_execution_engine をインポートできなかった理由をユーザーが知ることができるからです。
ただし、print sys.exc_info()
実際の例外メッセージを実際に画面に出力するのではなく、except EXCEPTION as some_variable_name
フォーマットを使用してから出力しprint some_variable_name
、スローされて割り当てられた例外に関連付けられた属性のいくつかを呼び出す方がよいことに気付きました。にsome_variable_name
。
このコードのチャンクがあった例外に関するPythonチュートリアルでこれが行われているのを見ました:
import sys
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except IOError as e:
print "I/O error({0}): {1}".format(e.errno, e.strerror)
except ValueError:
print "Could not convert data to an integer."
except:
print "Unexpected error:", sys.exc_info()[0]
raise
チャンクは、オブジェクトの属性と属性をexcept IOError as e
具体的に呼び出すことにより、例外メッセージをきめ細かく処理しているようです。ただし、ドキュメントを見ると、これらの特定の属性が例外のドキュメントの一部としてリストされていません。実際、これは Python ドキュメントの他のすべての例外にも当てはまります。そのため、特定の例外に関連付けられる属性を特定する方法はないようです。これについて何も知らない場合、構文を使用して例外を処理するときに、オブジェクトでどの属性を呼び出す必要があるかをどのように判断できるのでしょうか?errno
strerror
IOError
IOError
some_variable_name
import EXCEPTION as some_variable_name
これに関する誰かの提案に感謝します。あなたの答えが私の質問に直接答えていなくても、ここで私の例外をより適切に処理する方法について別のまったく異なる提案がある場合は、投稿することを躊躇しないでください!
どうもありがとうございました!