【问题标题】:What is the difference between syntax error and runtime error?语法错误和运行时错误有什么区别?
【发布时间】:2013-06-20 04:31:13
【问题描述】:

例如:

def tofloat(i): 
    return flt(i)

def addnums(numlist):
    total = 0
    for i in numlist:
        total += tofloat(i)
    return total

nums = [1 ,2 ,3]
addnums(nums)

flt 应该是float,但我很困惑它是语法错误还是运行时错误。

【问题讨论】:

  • 我不得不说,你问了一些非常有趣的问题:)。 +1

标签: python dynamic syntax runtime


【解决方案1】:

你有一个NameError,你的代码应该是:

def tofloat(i): 
    return float(i)

Python 中没有 flt 方法,这就是它不适合你的原因。

顺便说一句,你真的不需要将浮点转换包装到一个函数中,你的整个代码可以写成:

def addnums(numlist):
    return sum(map(float, numlist))

使用它:

>>> addnums(range(4))
6.0

【讨论】:

  • 这就是为什么问题说“flt 假设是 float()”(您已将其更改为更令人困惑的编辑)。它只是询问它是什么类型的错误。
【解决方案2】:

其实是运行时错误,因为Python会在运行时尝试解析flt这个名字(因为它是动态语言),却找不到。发生这种情况时,Python 会产生异常并指出它找不到您正在使用的符号 flt,而这一切都发生在运行时。

当解释器发现 Python 的语法不吸引人时,就会发生语法错误。例如:Python 的语法无法将输入语法识别为有效的 Python 程序。这可能发生在以下情况:

  1. 您忘记在if, def, class 等表达式的末尾添加:
  2. 您忘记关闭一些括号或括号等。
  3. 如果你不遵守 python 的语法,还有很多其他地方:)

在您的示例中,语法没有任何问题。对于解释器,flt(i) 是对 flt 方法的非常有效的调用,如果它确实存在,则必须在运行时在范围内检查它。所以解释器不会抱怨,你的问题的语法很好。

实际上,这可以看作是相对于C#、C++等编译语言的劣势。这种错误可以在编译时更快地检测到,编译器发现时会大声尖叫所以你可以注意到它。

使用动态语言,在调用实际方法之前您不会注意到这一点。您的程序很简单,因此您可能会很快找到它。但是,float 中缺少的 o 是在某个类的子类的子类中的某个遗留框架中,作为属性,在某个其他模块中等等。那将是苛刻的 :)

更新: 如果您了解 Python 内部的工作原理,那么 Python 文档中的 The execution model 是一本不错的读物。这将进一步澄清您的疑问,并为您提供很多知识:)

希望这会有所帮助!

【讨论】:

  • 还应该注意的是,在 Python 中,语法错误在技术上是运行时错误,因为它发生在运行时。但是,对于编译语言来说,情况并非如此——它们区分编译时错误(例如语法错误)和运行时错误(例如空指针错误)。
  • @PauloBu,请您检查一下这个 SO 问题stackoverflow.com/questions/17652075/…
【解决方案3】:

SyntaxError 由解析器在发现您的语法不正确时引发,例如缺少冒号、括号、无效语句等。除非您不解决该问题,否则它将不允许您执行代码。

您的代码只会在运行时抛出错误,即第一次调用函数 tofloat(i) 时,因此它是运行时错误。特别是NameError

还有一个运行时错误不会停止你的程序的执行,直到那个有缺陷的部分没有被执行。因此,如果您不调用 tofloat,您的代码实际上可以正常运行。

下面的代码可以正确执行到第三行,但随后会在引发NameError 时停止。(运行时错误)

print 1
print 2
print 3     
print foo

输出:

1
2
3
Traceback (most recent call last):
  File "so.py", line 4, in <module>
    print foo
NameError: name 'foo' is not defined

此代码不会执行,因为我们创建了 SyntaxError,尽管前 3 行完全没问题:

print 1
print 2
print 2
print (foo

输出:

$ python so.py
  File "so.py", line 5

              ^
SyntaxError: invalid syntax

请注意,python 中还有一个RunTimeError,当检测到不属于任何其他类别的错误时会引发该错误

【讨论】:

    猜你喜欢
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 2022-07-15
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 2019-07-11
    相关资源
    最近更新 更多