Also habe ich ein Programm, das eine Lines-Datei zu Grunde legt und alle Fehler auf stderr ausgibt.Python - Attribut Fehler, 'NoneType' Objekt hat kein Attribut
for line in lines_file:
#get offset up to start of coordinates
start = re.compile('\s*line\s*')
m = start.match(line)
offset = m.end()
try:
for i in range(4):
xy = re.compile('\s*([-]?[0-9]{1,3})\s*')
if xy.match(line,offset):
m = xy.match(line,offset)
else:
raise Exception
coordinate = m.group(1)
if int(coordinate) > 250 or int(coordinate) < -250:
raise Exception
offset = m.end()
end = re.compile('\s*$')
if not end.match(line,offset):
raise Exception
except Exception as e:
print >> sys.stderr, 'Error in line ' + str(line_number) + ":"
print >> sys.stderr, " " * 4 + line,
print >> sys.stderr, " " * (offset + 4) + "^"
line_number = line_number + 1
continue
Und wenn ich in einem ungültigen Eingangsleitungen stelle die ungültigen Zeilen erwarten zu stderr gedruckt wird, wird der Ausgang I erhalten ist:
Traceback (most recent call last):
File "lines_to_svg.py", line 37, in <module>
offset = m.end()
AttributeError: 'NoneType' object has no attribute 'end'
Da dies ein Fragment meines Codes ist, Linie 37 der, der offset = m.end()
sagt. Warum bekomme ich immer einen Attributfehler? Hier ist der Code, der für Schleife oben nur für den Fall, bevor das kommt dies verursacht den Fehler:
import sys
import re
# SVG header with placeholders for canvas width and height
SVG_HEADER = "<svg xmlns=\"http:#www.w3.org/2000/svg\" version=\"1.1\""" width=\"%d\" height=\"%d\">\n"
# SVG bounding box with placeholders for width and height
SVG_BOUNDING_BOX = "<rect x=\"0\" y=\"0\" width=\"%d\" height=\"%d\""" style=\"stroke:#000;fill:none\" />\n"
# SVG line with placeholders for x0, y0, x1, y1
SVG_LINE = "<line x1=\"%d\" y1=\"%d\" x2=\"%d\" y2=\"%d\""" style=\"stroke:#000\" />\n"
# SVG footer
SVG_FOOTER = "</svg>"
CANVAS_HEIGHT = 500
CANVAS_WIDTH = 500
# process command line arguments
if len(sys.argv) != 2:
print >> sys.stderr, "Usage:", str(sys.argv[0]), "lines_file"
exit(1)
#open file for reading
try:
lines_file = open(sys.argv[1], 'r')
except IOError:
print >> sys.stderr, "Cannot open:", str(sys.argv[1])
exit(2)
offset = 0
line_number = 1
Das Problem mit offset = m.end()
ist, aber ich kann nicht scheinen, um herauszufinden, warum das ist, die den Fehler verursacht.
Sieht so aus, als ob Sie nicht den Code zeigen, den Sie tatsächlich ausführen. Die Zeile 'offset = m.end()' befindet sich innerhalb eines 'try'- 'except'-Blocks. Daher sollten Sie die Ausgabe Ihres Error-Handlers und nicht die Standard-Traceback-Methode verwenden. –
Nun, ich zeige nicht die volle Leistung. Die ersten beiden Zeilen meiner Ausgabe zeigen den Fehler für die ungültigen Zeilen, aber danach zeigt es den Attributfehler. – Chase
Lesen Sie den Traceback. Es gibt nur einen Weg, es zu interpretieren. Haben Sie schon gelernt, Trace-Backs zu lesen? –