38

これと同様の質問を見たことがありますが、実際にトラックバックに対処しているものはありません。私がそのようなクラスを持っている場合

class Stop_if_no_then():
    def __init__(self, value one, operator, value_two, then, line_or_label, line_number):
        self._firstvalue = value_one
        self._secondvalue = value_two
        self._operator = operator
        self._gohere = line_or_label
        self._then = then
        self._line_number = line_number

    def execute(self, OtherClass):
        "code comparing the first two values and making changes etc"

execute メソッドで実行できるようにしたいのは、self._then が文字列 "THEN" (すべて大文字) と等しくない場合、カスタム エラー メッセージを発生させ、トレースバックを表示せずにプログラム全体を終了させることです。 .

エラーが発生した場合、印刷する必要があるのは次のようなものだけです (例として 3 を使用しています。フォーマットは問題ありません)。

`Syntax Error (Line 3): No -THEN- present in the statement.`

私はそれが実際に例外クラス オブジェクトであることについてあまりうるさくないので、その面では問題はありません。これをwhileループで使用するので、単純なif、elifはメッセージを何度も繰り返すだけです(明らかにループを閉じていないため)。sys.exit() を見たことがありますが、正しく使用していない限り、赤いテキストの巨大なブロックも出力されます。このようなものを実装する必要がある同じモジュールに他のクラスがあるため、ループで例外をキャッチしたくありません。

4

7 に答える 7

65

深さを制限することで、トレースバックをオフにすることができます。

Python 2.x

import sys
sys.tracebacklimit = 0

Python 3.x

Python 3.5.2 および 3.6.1 では、に設定tracebacklimit0ても意図した効果が得られないようです。これは既知のバグです。-1どちらも機能しないことに注意してください。Noneただし、少なくとも今のところは機能するようです。

Python 3.6.2以降では、またはに設定するtracebacklimit必要があります。設定してもトレースバック出力は無効になりません。0-1None

Python 3.6.1 と以下の結果:

>>> import sys

>>> sys.tracebacklimit = 0
>>> raise Exception
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Exception

>>> sys.tracebacklimit = -1
>>> raise Exception
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Exception

>>> sys.tracebacklimit = None
>>> raise Exception
Exception

Python 3.6.2 以降の結果:

>>> import sys

>>> sys.tracebacklimit = 0
>>> raise Exception
Exception

>>> sys.tracebacklimit = -1
>>> raise Exception
Exception

>>> sys.tracebacklimit = None
>>> raise Exception
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Exception

それにもかかわらず、良くも悪くも、複数の例外が発生した場合でも、それらはすべて出力される可能性があります。例えば:

socket.gaierror: [Errno -2] Name or service not known

During handling of the above exception, another exception occurred:

urllib.error.URLError: <urlopen error [Errno -2] Name or service not known>
于 2014-02-04T15:42:54.647 に答える
18

SystemExit 例外を使用できます。

except Exception as err:
    raise SystemExit(err)

https://docs.python.org/3/library/exceptions.html

于 2020-03-25T10:40:32.747 に答える
14

try:aを使用してからexcept Exception as inst: 、inst という名前の変数にエラー メッセージを表示し、エラーの引数を で出力できますinst.args。それを印刷して何が起こるか見てみてくださいinst.args

EDIT これは私がpythons IDLEで試した例です:

>>> try:
    open("epik.sjj")
except Exception as inst:
    d = inst


>>> d
FileNotFoundError(2, 'No such file or directory')
>>> d.args
(2, 'No such file or directory')
>>> d.args[1]
'No such file or directory'
>>> 

EDIT 2:プログラムを閉じるときは、いつでもraiseエラーが発生するか、使用できますsys.exit()

于 2013-07-22T10:21:45.913 に答える
6

税関例外のトレースバックを取り除き、行番号を知りたい場合は、このトリックを行うことができます

パイソン3

import sys
import inspect

class NoTraceBackWithLineNumber(Exception):
    def __init__(self, msg):
        try:
            ln = sys.exc_info()[-1].tb_lineno
        except AttributeError:
            ln = inspect.currentframe().f_back.f_lineno
        self.args = "{0.__name__} (line {1}): {2}".format(type(self), ln, msg),
        sys.exit(self)

class MyNewError(NoTraceBackWithLineNumber):
    pass

raise MyNewError("Now TraceBack Is Gone")

この出力が得られ、raiseキーワードが役に立たなくなります

MyNewError (line 16): Now TraceBack Is Gone
于 2017-01-01T09:09:10.353 に答える
3

一般に、 以外の例外をキャッチしSystemExit、トレースバックなしで例外のメッセージを表示して終了する場合は、次のようにmain関数を定義します。

>>> import sys

>>> def main():
...     try:
...         # Run your program from here.
...         raise RandomException  # For testing
...     except (Exception, KeyboardInterrupt) as exc:
...         sys.exit(exc)
... 
>>> main()
name 'RandomException' is not defined

$ echo $?
1

複数の例外が発生した場合、1 つのメッセージのみが出力されることに注意してください。

この回答は、The-IT による回答を改善することを目的としています。

于 2016-10-07T00:31:02.747 に答える