【问题标题】:Python - printing out errorsPython - 打印错误
【发布时间】:2016-03-26 21:52:38
【问题描述】:

所以我有一个程序可以推理行文件并将任何错误打印到标准错误。因此,如果我得到如下所示的输入:

line 1 2x 3 4
line 1 2 x3 4
lixe 251 2 3 4 5
line 1 2 3 4
line 251 2 3 4

那么输出应该是这样的:

Error in line 1:
   line 1 2x 3 4
           ^
Error in line 2:
   line 1 2 x3 4
            ^
Error in line 3:
   lixe 251 2 3 4 5
     ^
Error in line 5:
   line 251 2 3 4
        ^
Error in line 6:
   line 1 2 3 4 5
                ^

这就是我的错误检查:

except Exception as e:
    for line in lines_file:
        print >> sys.stderr, 'Error in line ' + str(line_number) + ":"
        print >> sys.stderr, " " * 4 + line,
        print >> sys.stderr, " " * (offset + 4) + "^"
sys.exit(1)

但是对于这段代码,输出是这样的:

Error in line 1:
    line 1 2 x3 4
            ^
Error in line 1:
    lixe 251 2 3 4 5
            ^
Error in line 1:
    line 1 2 3 4
            ^
Error in line 1:
    line 251 2 3 4
            ^
Error in line 1:
    line 1 2 3 4 5
            ^
Error in line 1:
    line 1 2 3 4 x5
            ^

而且它只显示一行。那么我怎样才能让它打印出所有的行呢?这是我的 try bock 代码:

for line in lines_file:
    line_number = 1
    #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:
        for line in lines_file:
            print >> sys.stderr, 'Error in line ' + str(line_number) + ":"
            print >> sys.stderr, " " * 4 + line,
            print >> sys.stderr, " " * (offset + 4) + "^"
    sys.exit(1)

    line_number += 1
    offset = 0

    p = re.compile('line\s*([-]?[0-9]{1,3})\s*([-]?[0-9]{1,3})\s*([-]?[0-9]{1,3})\s*([-]?[0-9]{1,3})')
    m = p.match(line)
    x0 = int(m.group(1))
    y0 = int(m.group(2))
    x1 = int(m.group(3))
    y1 = int(m.group(4))

    print str(x0), str(y0), str(x1), str(y1)

【问题讨论】:

  • 你需要编写一个循环来打印所有内容
  • 什么样的循环。你去“for x in line”的地方是for each循环吗?
  • 好的,我更新了我的代码以显示我的程序的更多内容。
  • 再次更新了我的代码,尝试循环遍历所有行错误,但我仍然无法获得正确的输出。
  • 刚刚再次更新了我的代码。现在不止一行,但实际的行不按顺序排列。

标签: python printing


【解决方案1】:

不确定这是否能解决问题,但在查看您的代码时会弹出两件事...

(1) except 块没有与try 块缩进。

(2) 因此,line_numberoffset 变量似乎永远不会更新。

如果您将except 块放在try 的级别,那么每次发现异常时都会执行except 下的代码,并且您不需要在其中添加第二个for line ... 循环它。

【讨论】:

  • 它实际上是用 try 块正确缩进的,但我猜当我在这里粘贴代码时它会自动格式化。
  • 我明白了——感谢您修复它。一个问题:为什么在看到异常时需要循环遍历这些行?在它被捕获后,它应该简单地打印那一行....
猜你喜欢
  • 2012-07-25
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
相关资源
最近更新 更多