由于Stack Overflow上有一堆问题用Python处理SyntaxError
,因此我们可能想知道:
我们如何应对SyntaxError
?有一般可以应用的策略吗?
答案 0 :(得分:1)
即使在遇到SyntaxError
之前,也要处理SyntaxErrors
的重要措施,因为处理SyntaxErrors
的最佳方法是首先避免使用它们。首先,可以使用具有syntax highlighting for Python的编辑器或集成开发环境(IDE)来完成此操作。
除此之外,我们还可以通过良好的代码和格式化样式来降低遇到SyntaxError
的风险。术语“良好的格式样式” PEP 8 -- Style Guide for Python Code有一个正式定义。正确的格式设置可以使我们的代码更具可读性,从而降低了编写导致SyntaxError
的代码的风险。
对我们的代码应用良好格式的一种非常好的方法是使用自动代码格式化工具。代码格式化程序具有多个优点,其中包括以下优点:它的代码格式化是一致的。它采用了您可能尚未想到的最佳实践。非常方便。
对于Python,black是很棒的代码格式化工具。
语法错误指示解释器在哪个文件和哪一行中遇到了我们的代码中的问题。我们应该使用此信息来查找错误。
我们应该注意,Python解释器有时会在实际问题后的 行中指示SyntaxError
。这是因为解析器期望错误行中的某些内容,并且可以识别出仅当整个行都已解析时才丢失该内容。这种SyntaxError
的原型示例是缺少括号。因此,例如,以下代码在SyntaxError
行中引发了2
,即使该错误在1
行中也是如此:
bar = foo(
baz()
SyntaxError: EOL while scanning string literal
。当您没有正确用引号引起来关闭字符串定义时,通常会出现这种情况,例如以下示例:foo = "bar
通常,错误修复的一个好策略是将引发错误或异常(或不返回预期输出)的任何代码减少到minimal example。 (这是有关Stack Overflow的问题的要求,但不仅如此,这是固定bug的好方法。)
在SyntaxError
的情况下,产生一个最小的示例通常非常容易,因为SyntaxError
并不依赖于变量的任何值,对象的任何状态或变量的任何其他语义。您的代码。这就是SyntaxError
的源通常是一行代码的原因。
因此,为了识别错误,我们删除了我们认为是错误来源的所有行以外的所有代码。如果错误消失,则它位于不同的行。如果错误仍然存在,我们将尝试简化此行。例如,我们通过定义保存值的中间变量来替换嵌套括号:
代替
bar = foo(foo(baz(foo()))
以下(逻辑等效)代码:
first = foo()
second = baz(first)
third = foo(second)
bar = foo(third
使我们更容易识别缺少的右括号。
答案 1 :(得分:0)
请参阅文档。不幸的是,语法错误无法在Try:Except:块中捕获,因此处理它们的唯一方法是读取返回的消息,如果这样做没有帮助,请紧跟python文档: