it-swarm.com.de

Drucken Sie eine Fehlermeldung, ohne ein Traceback zu drucken, und schließen Sie das Programm, wenn eine Bedingung nicht erfüllt ist

Ich habe ähnliche Fragen wie dieses gesehen, aber keiner von ihnen befasst sich wirklich mit dem Trackback. Wenn ich eine solche Klasse habe

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"

Ich möchte, dass meine Ausführungsmethode in der Lage ist zu tun, wenn self._then nicht gleich der Zeichenfolge "THEN" (in allcaps) ist. Dann möchte ich, dass es eine benutzerdefinierte Fehlermeldung ausgibt und das gesamte Programm abbricht, während auch kein Traceback angezeigt wird .

Wenn der Fehler auftritt, sieht die einzige Sache, die ausgedruckt werden sollte, etwa so aus (ich verwende 3 als Beispiel, die Formatierung ist kein Problem).

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

Ich bin nicht sehr wählerisch, da es sich tatsächlich um ein Ausnahmeklassenobjekt handelt, daher gibt es in diesem Aspekt kein Problem. Da ich dies in einer while-Schleife verwenden werde, einfach, wenn Elif die Nachricht immer und immer wieder wiederholt (weil ich die Schleife offensichtlich nicht schließe). Ich habe sys.exit () gesehen, aber das druckt auch einen riesigen roten Textblock aus, sofern ich ihn nicht richtig verwende. Ich möchte die Ausnahme in meiner Schleife nicht einfangen, da sich in demselben Modul noch andere Klassen befinden, in denen ich so etwas implementieren muss.

13
user2560035

Sie können einen try: und dann except Exception as inst: Verwenden. Sie erhalten dann eine Fehlermeldung in einer Variablen namens inst und Sie können die Argumente des Fehlers mit inst.args ausdrucken. Versuchen Sie es auszudrucken und sehen Sie, was passiert. Jeder Artikel in inst.args ist der, nach dem Sie suchen.

BEARBEITEN Hier ist ein Beispiel, das ich mit Pythons IDLE ausprobiert habe:

>>> 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'
>>> 

BEARBEITEN 2: Zum Schließen des Programms können Sie immer raise und Fehler oder Sie können sys.exit() verwenden.

8
The-IT

Sie können das Traceback deaktivieren, indem Sie dessen Tiefe begrenzen.

Python 2.x

import sys
sys.tracebacklimit = 0

Python 3.x

In Python 3.5.2 und 3.6.1 scheint die Einstellung von tracebacklimit auf 0 nicht die beabsichtigte Wirkung zu haben. Dies ist ein bekannter Fehler . Beachten Sie, dass -1 auch nicht funktioniert. Die Einstellung auf None scheint jedoch zumindest zu funktionieren.

>>> 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

Wenn jedoch mehrere Ausnahmen ausgelöst werden, können sie alle noch gedruckt werden. Zum Beispiel:

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>
46
Marco Costa

Der sauberste Weg, den ich kenne, ist sys.excepthook.

Sie implementieren eine Funktion mit drei Argumenten, die type, value und traceback akzeptiert und macht, was Sie möchten (zum Beispiel nur den Wert drucken) und diese Funktion sys.excepthook zuweisen.

Hier ist ein Beispiel:

import sys

def excepthook(type, value, traceback):
    print(value)

sys.excepthook = excepthook

raise ValueError('hello')

Dies ist in Python 2 und Python 3 verfügbar.

4
Mark Veltzer

Wenn Sie ein Traceback für Zollausnahmen loswerden möchten und die Zeilennummer Haben, können Sie diesen Trick ausführen

Python 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")

Gibt diese Ausgabe aus und macht das Schlüsselwort raise unbrauchbar

MyNewError (line 16): Now TraceBack Is Gone
2
creuilcreuil

Wenn Sie eine Ausnahme mit Ausnahme von SystemExit abfangen möchten und die Meldung der Ausnahme ohne Traceback beenden möchten, definieren Sie im Allgemeinen Ihre main-Funktion wie folgt:

>>> 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

Beachten Sie, dass bei mehreren Ausnahmen nur eine Nachricht gedruckt wird.

Diese Antwort soll das one von The-IT verbessern.

2
A-B-B