2016-07-10 1 views
0
#! python3 
from contextlib import redirect_stderr 
import io 

f = io.StringIO() 
with redirect_stderr(f): 
    # simulates an error 
    erd 

機能しません。しかし、それはエラーメッセージがコマンドプロンプトにプリントアウトされたとして、動作しません:にredirect_stderrは、上で見たように、私は<code>StringIO</code>オブジェクトに標準エラー出力をリダイレクトする<code>redirect_stderr</code>関数を使用している(パイソン3.5)

Traceback (most recent call last): 
    File "C:\Users\max\testerr.py", line 8, in <module> 
    erd 
NameError: name 'erd' is not defined 

を私はPythonの3.5.1 64ビットと同じ結果に3.5.2 64ビットでそれをテストしました。

A similar issue in this thread

リンクされたスレッドで説明したように、私は、ファイルへの書き込みエラー試してみましたが、ファイルがスクリプトを実行した後、空になっています。

+0

初期化の前にerdにアクセスすると思います。変数の定義を検討するか、関数呼び出しで渡されて再実行されるかどうかを確認できますか? –

+0

'sys.stderr = io.StringIO()'の場合、エラーが引き続き発生するので、例外を捕捉しているioオブジェクトバーに格納することは冗長であるように見えます –

答えて

2

実際にstderrに書き込む必要があります。例外をキャッチするツールではありません。

>>> from contextlib import redirect_stderr 
>>> import io 
>>> f = io.StringIO() 
>>> import sys 
>>> with redirect_stderr(f): 
... print('Hello', file=sys.stderr) 
... 
>>> f.seek(0) 
0 
>>> f.read() 
'Hello\n' 

例外をキャッチするには、もう少し作業が必要です。ロギングライブラリ(外部)を使用するか、独自の例外ハンドラを作成してカスタム出力を使用することができます。ここで

は、ストリームへの書き込みを支援するために、ロガーインスタンスを使用して迅速な何か、である:

log = logging.getLogger('TEST') 
log.addHandler(logging.StreamHandler(stream=f)) 

def exception_handler(exc_type, exc_value, exc_traceback): 
    if issubclass(exc_type, KeyboardInterrupt): 
     # Let the system handle things like CTRL+C 
     sys.__excepthook__(*args) 
    log.error('Exception: ', exc_info=(exc_type, exc_value, exc_traceback)) 

sys.excepthook = exception_handler 
raise RuntimeError('foo') 

ここf上から同じStringIOインスタンスです。このコードを実行すると、コンソールにトレースバックは表示されませんが、ストリームオブジェクトに格納されます。

+0

説明をありがとうございます。私は 'redirect_stderr'がstderrの出力を暗黙的に抑止できると仮定しました。 – iridescent

関連する問題