Ich habe ein paar Zeilen Code, die ich über exec() ausführen muss und ich würde gerne wissen, welche Zeile ZeroDivisionError steigt.Ho die Argumente eines ZeroDivisionError abfangen, die über exec() ausgeführt werden?
Hier ein Beispiel:
code = \
'''
a = 9
b = 0
c = a/b
print(c)
'''
>>>exec(code)
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-3-00bada8e7a44> in <module>()
5 print(c)
6 '''
----> 7 exec(code)
<string> in <module>()
ZeroDivisionError: division by zero
Das ist in Ordnung, aber ich möchte c = a/b
statt exec(code)
als Argument der Ausnahme haben, wie es für andere Arten von Fehler tritt auf:
code = \
'''
a = 9
b = 0
c === b
print(c)
'''
>>>exec(code)
File "<string>", line 4
c === b
^
SyntaxError: invalid syntax
In diesem Fall zeigt SyntaxError
direkt auf die Zeile, die für den Fehler verantwortlich ist.
Warum dieser Unterschied? Wie kann ich ZeroDivisionError
richtig angezeigt bekommen?
UPDATE
Ich habe die „compile()
Lösung“ von Schore vorgeschlagen versucht, aber es hat nicht funktioniert, wie in meinem Fall erwartet:
code = \
'''
a = 9
b = 0
c = a/b
print(c)
'''
z = compile(code, "", "exec")
>>>exec(z)
ZeroDivisionError Traceback (most recent call last)
<ipython-input-8-857f94e79b67> in <module>()
6 '''
7 z = compile(code, "", "exec")
----> 8 exec(z)
? in <module>()
ZeroDivisionError: division by zero
Ich nehme an, dass Sie vollständig verstehen, dass 'exec' (und' eval') ein [Sicherheitsrisiko] sein kann (http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html), und dass Sie einen Weg haben um zu verhindern, dass gefährlicher Code "ausgeführt" wird ... –
Ja, ich weiß, ich habe Sicherheitsüberprüfung des Codes und bis jetzt ist es nur für Code-Schnipsel, die ich geschrieben habe, also sollte es in Ordnung sein. –