例えばPythonで
print()をprrint()と書き間違えた時、
Python
1$ python3 /Users/USER/Desktop/test.py 2Traceback (most recent call last): 3 File "/Users/USER/Desktop/test.py", line 1, in <module> 4 prrint("a") 5NameError: name 'prrint' is not defined
とエラー表示されますが、
loggingを使ってこれを表示することは可能ですか?
下のように書いた場合、どこでエラーが起こったのかは見当つきそうですが、なぜエラーが起こったのかはログからは判別が難しいので。
Python
1import logging 2import os 3import sys 4 5LEVEL = "DEBUG" 6 7LOG_DIR = os.path.dirname(sys.argv[0]) 8LOG_FILENAME = "programlog.log" 9LOG_FILE = LOG_DIR + "/" + LOG_FILENAME 10 11FORMAT = "%(asctime)s , %(message)s" 12 13logging.basicConfig(level=LEVEL, filename=LOG_FILE, format=FORMAT, datefmt="%Y/%m/%d %H:%M:%S") 14 15logging.debug("print()の前") 16 17prrint("a") # ここでエラーが起こる 18 19logging.debug("print()の後")
log
12020/09/16 15:20:00, print()の前
それはtryで捕捉してはいけないタイプのエラーです
strerrというのがあるそうですが、そちらの方がいいでしょうか?
sys.stderr = open(fle, "a")
ただこれだと
prrint("") # rが1文字多い
は検出できましたが
print(""") # "が1文字多い
は検出できませんでした。
(コンソール画面にエラーが表示され、stderr出力ファイルにはなにも出なかった。)
そういう意味ではありません。
> prrint("") # rが1文字多い
これが1文字多い間違い方をしているのは人間だけです。
なぜならprrintを定義して使う事も出来るからです
一般的にそういう名前の定義をする人がいるかどうかは関係ありません。
なので実行時にはただのプログラミングミスとして「未定義」としてエラー出力され正常動作しない状態が正解で、それを確認した時点で修正するべきものです。
try~exceptするのは飽くまで「実行するまで正常動作するか分からない」ものだけです。毎回必ずエラーになると分かっているものはtryせずに修正しましょう。
print()のエラーはあくまで例ですので、実際のエラーはそうとは限りません。
あくまで自分がデバックしている時点でバグはなかったが、ユーザに使ってもらったときにバグが発生したときに情報を収集するためにエラーをファイルへ出力したいと考えています。
どういう使われ方想像しているのか全く分からないけど、モジュールで提供したものを別に誰かに使ってもらってその記述が正しくない場合の事を考えていますか?
そうだとしても記述ミスに対してなら既に言った内容と同じですが。
また、モジュール内で勝手にエラーをファイル出力する話をしているのだとしても、基本的にはバグの原因となるやり方なので無いですね
そうですか。
ただ、エラーの原因が明確でないと修正することもできませんし、推測で修正しても根本的な解決にならないと思うので、いろいろ考えてみます。
回答1件
あなたの回答
tips
プレビュー