2013-04-08 27 views
8

私は同じループ内の約10の異なるファイルに&を書き込む必要があります。 例えば:Pythonで例外の詳細を取得

for i in range(0,10): 
    try: 
     a=5 
     file1 = open("file1.txt",'w+') 
     file2 = open("file2.txt",'w+') 
     #... etc 

     print(str(a),file=file1) 
     print(str(a)+"hi",file=file2) 
     # ... etc 
    except: 
     #error handling 

今私が何をしたいのですがどのような一般的な例外の中に書かれた/オープンされたものをファイルとして特定の例外情報を取得することができます。私の現在の理解から、私は私が望むものを達成するために、このような何かをする必要があると思います。私は、約10の異なるファイルのためにこれをしなければならないとき、非常に不格好と魅力のない取得する予定です

for i in range(0,5): 
    a=5 
    try: 
     file1 = open("file1.txt",'w+') 
     print(str(a),file=file1) 
    except: 
     #error handling for file1 
    try: 
     file2 = open("file2.txt",'w+') 
     print(str(a)+"hi",file=file2) 
    except: 
     #error handling for file2 

... 。私の最初の例のような一般的な例外からファイル名情報を取得する方法はありますか?基本的に、例外はfile1操作のためのtry/exceptを除いて "file1に書き込むときのエラー"のようなものを報告することができます。

編集:これは、ファイルに書き込まれるデータの大量の単純化です。 str(a)とstr(a)+ "hi"は、実際に書かれたデータの実際の表現ではありません。 file1にはハードコードされた整数が必要な場合があります.file2には複数の変数でフォーマットされた文字列が必要な場合があります。オープン/ライティングプロセスをループに一般化することは、うまく動作しません。

答えて

1

ループを使用していますが、実際にはループを使用していません。ループを使用します。そうすれば、1つのファイルを1つずつtryブロック内に書き込むことができます。 1つの値をそれぞれ書き込む以外のファイルでは何もしていないように見えるので、それらをすべて開いたままにする必要はありません。

for filename in ['file1.txt', 'file2.txt', ...]: 
    try: 
     with open(filename, 'w+') as f: 
      f.write(str(a)+"whatever") 
    except IOError: 
     print("Error occurred with", filename) 

編集:あなたは、別のファイルに書き込むファイルとデータの間のマッピングを格納した辞書や事前の他のデータ構造を作成し、その後、ループ内でそれを使用するために乱暴に異なるものを持っている場合。

data = {'file1.txt': str(a), 'file2.txt': 'something else', 'file3.txt': str(a)+str(b)} 

for filename, output in data.items(): 
    try: 
     with open(filename, 'w+') as f: 
      f.write(output) 
    except IOError: 
     print("Error occurred with", filename) 
+0

Iが考慮されるべき含まれるコードのためのものあたかも既にループしていたかのように。それを修正してください。 これに関係なく、私の問題は本当に解決されません。これらのファイルに書き込まれる内容は、必ずしもどのような形、形、形式であっても同じではありません。 file1にはハードコーディングされた "1"が必要な場合があり、file2には変数が必要な場合があり、file3には複数の変数が必要な場合があります。何が起きるかは、 "with"内の巨大なif文です。例えば"filename = file1ならば、これを書いてください;もしfilename = file2なら、それを書いてください;もしfilename = file3なら、この他のものを書いてください"。コードはちょうどclunkyになります – user891876

+0

@ user891876:私の編集された答えを見てください。ファイルとデータの関係を事前に整理し、各データをループ内の関連付けられたファイルに書き込みます。 – BrenBarn

+0

length(str(a)+ str(b))> 5の場合、file3に印刷したくない場合はどうすればいいですか? 各ファイルにはそれぞれ固有のロジックが必要です。 – user891876

15

現在、例外オブジェクト自身を含む、処理された例外に関する情報を取得するためにsys.exc_infoを使用することができます。 IOError例外は、ファイル名、エラー番号、およびエラーを説明する文字列を含む必要な情報のすべてが含まれています:tryブロックで

import sys 

try: 
    f1 = open('example1') 
    f2 = open('example2') 
except IOError: 
    type, value, traceback = sys.exc_info() 
    print('Error opening %s: %s' % (value.filename, value.strerror)) 

実行は明らかにまだ最初の例外の後に停止します。

1

exc_type, value, exc_traceback = sys.exc_info()を使用する場合、例外が発生したファイル名は、以下により得ることができることに注意してください。

exc_traceback.tb_frame.f_locals.get('filename') 
関連する問題