2

現在、例外をキャッチするコードを作成しようとしていますが、どの例外がスローされたかによって、例外がスローされなかった場合とは異なるモジュールがインポートされます。

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 つのステートメントで十分に捕捉できることを願っています。これらの進行がなければ、モジュールは次に進みます。drmaaimport sge_execution_enginesge_execution_engineimport drmaaRuntimeErrordrmaaimport drmaasge_execution_enginedrmaaexceptdrmaadrmaaimport 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 ドキュメントの他のすべての例外にも当てはまります。そのため、特定の例外に関連付けられる属性を特定する方法はないようです。これについて何も知らない場合、構文を使用して例外を処理するときに、オブジェクトでどの属性を呼び出す必要があるかをどのように判断できるのでしょうか?errnostrerrorIOErrorIOError some_variable_nameimport EXCEPTION as some_variable_name

これに関する誰かの提案に感謝します。あなたの答えが私の質問に直接答えていなくても、ここで私の例外をより適切に処理する方法について別のまったく異なる提案がある場合は、投稿することを躊躇しないでください!

どうもありがとうございました!

4

2 に答える 2