【问题标题】:How to catch IndentationError [duplicate]如何捕捉 IndentationError [重复]
【发布时间】:2012-01-18 14:25:46
【问题描述】:

首先 - 我对缩进错误的代码没有意见,而且我知道这个异常是如何工作的。

我问,是否有任何方法可以使用 try/except 块在代码中捕获 IndentationError?例如,假设我正在为其他人编写的函数编写测试。我想在 try/except 块中运行它并处理他/她可能发出的所有警告。我知道,这不是一个最好的例子,而是我想到的第一个例子。请不要专注于一个例子,而要专注于问题。

我们来看代码:

try:
    f()
except IndentationError:
    print "Error"

print "Finished"

功能:

def f():
  print "External function"

结果是:

External function
Finished

这就是一些东西,我已经准备好理解了,因为外部函数中的缩进是一致的。

但是当函数看起来像这样时:

def f():
  print "External function"
     print "with bad indentation"

异常未处理:

    print "with bad indentation"
    ^
IndentationError: unexpected indent

有什么方法可以实现吗?我想这是编译的问题,到目前为止我看不到任何可能。 except IndentationError 有意义吗?

【问题讨论】:

  • 请注意IndentationErrorSyntaxError 的子类。

标签: python exception-handling indentation


【解决方案1】:

是的,这可以做到。但是,被测函数必须位于不同的模块中:

# test1.py
try:
    import test2
except IndentationError as ex:
    print ex

# test2.py
def f():
    pass
        pass # error

运行时,它会正确捕获异常。立即对整个模块进行检查是毫无价值的;我不确定是否有办法让它更细粒度。

【讨论】:

    【解决方案2】:

    IndentationError 在编译模块时引发。您可以在导入模块时捕获它,因为模块将在第一次导入时编译。您不能在包含try/except 的同一模块中捕获它,因为使用IndentationError,Python 将无法完成模块的编译,并且模块中的任何代码都不会运行。

    【讨论】:

      【解决方案3】:

      您可以使用诸如pylint 之类的工具,它会分析您的模块并报告错误的缩进以及许多其他错误。

      【讨论】:

        猜你喜欢
        • 2021-03-08
        • 2016-09-19
        • 1970-01-01
        • 2015-12-19
        • 1970-01-01
        • 2016-12-12
        • 2011-12-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多