2

ファイルを解析するコードがあります。それは次のように単純です:

for line in config_file:
    line_split=line.split("|")
    pid_index = int(line_split[3])
    date_locations = [int(i) for i in line_split[2].split(",")]
    in_file = line_split[0]
    out_file = line_split[1]
    file_info.append([in_file, out_file, date_locations, pid_index])

何かが発生した場合、Pythonに通常のエラーメッセージの出力を続行させたいのですが、通常のエラーメッセージの最後に次のような行を追加したいと思います。

except:
    print "line \"{0}\"  might have failed to parse".format(line.rstrip())

ただし、上記のコードでは、追加の情報行のみが表示されます。通常のエラーメッセージは上書きされます。

キャッチに次のものを追加しようとしましたが、見苦しい出力が生成されます。

e = sys.exc_info()
for i in e:
    print i

Pythonに通常のエラーメッセージと選択した追加情報を出力させる簡単な方法はありますか?

4

3 に答える 3

3

ここでの最良のオプションは、問題を説明する独自の例外を作成し、それを使用することです。

class ParseFailureError(Exception):
    def __init__(self, line):
        self.line = line.rstrip()

    def __str__(self):
        return "line \"{0}\"  might have failed to parse".format(self.line)

それから:

try:
    ...
except SomeException as exception:
    raise ParseFailureError(line) from exception

次のようなものが生成されます。

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
NameError: name 'x' is not defined

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
__main__.ParseFailureException: line "blah" might have failed to parse

(例NameErrorとしてa を使用しSomeErrorました)

あなたの行に特定の例外を追加したことに注意してください。例外をexceptキャッチすると、意図しないエラーを無視する可能性があるため、これは常に実行する価値があります。

この方法には、この特定の例外をキャッチできるため、他のソフトウェアがコードを使いやすくなるという利点があります。

例外のfrom構文は、例外の根本原因を Python に伝えます。それ以外の場合、Python は新しい例外が例外の処理中に発生したエラーであると想定します。これは Python 3.x でのみ使用できることに注意してください。以前のバージョンでは、これを手動で行う必要があります。traceback.format_exc()例外のエラーメッセージの一部としてそれを印刷することをお勧めします。

于 2012-12-02T20:14:21.460 に答える
2

ロギングモジュールを使用できます:

import sys
import logging
logging.basicConfig(level = logging.DEBUG)
logger = logging.getLogger(__name__)

config_file = """\
foo bar
""".splitlines()
try:
    for line in config_file:
        line_split=line.split("|")
        pid_index = int(line_split[3])
        date_locations = [int(i) for i in line_split[2].split(",")]
        in_file = line_split[0]
        out_file = line_split[1]
        file_info.append([in_file, out_file, date_locations, pid_index])
except IndexError as err:
    logger.exception('line {l!r} might have failed to parse'.format(
        l = line.rstrip()))    
    sys.exit()

収量

ERROR:__main__:line 'foo bar' might have failed to parse
Traceback (most recent call last):
  File "/home/unutbu/pybin/test2.py", line 15, in <module>
    pid_index = int(line_split[3])
IndexError: list index out of range
于 2012-12-02T20:24:19.223 に答える
2

exceptエラーを抑制します。余分なメッセージを印刷するためにそれをキャッチしたいのですが、それから再び戻ってくるようにします。あなたはそのようにします

try:
    raise ValueError("I do not like green eggs and ham")
except ValueError as e:
    print("OK, actually I do.")
    raise

Python 2.x では、一度に 1 つの例外しかスローできません。Python 3では、次のことができます

raise ValueError("OK, actually I do.") from e

このエラーが前のエラーによって引き起こされたことを示します。

于 2012-12-02T20:14:00.183 に答える