语法错误和运行时错误有什么区别?

时间:2013-06-23 15:39:57

标签: python dynamic syntax runtime

例如:

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,但我很困惑它是语法错误还是运行时错误。

3 个答案:

答案 0 :(得分:7)

实际上,这是一个运行时错误,因为Python会尝试在运行时解析flt名称(因为它是一种动态语言),并且它不会找到它。当发生这种情况时,Python会产生异常,说它无法找到您使用的符号flt,所有这些都在运行时发生。

当解释器发现使用Python语法不具吸引力的东西时,会发生语法错误。例如:Python的语法不能将输入语法识别为有效的Python程序。这可能发生在:

  1. 您忘了在:等结尾处添加if, def, class
  2. 您忘了关闭一些括号或括号等。
  3. 当你不遵守python的语法时,很多地方:)
  4. 在您的示例中,语法没有任何问题。对于解释器,flt(i)是对flt方法的非常有效的调用,如果它确实存在,则必须在范围内在运行时进行检查。因此,口译员不会投诉,你的问题的语法也不错。

    实际上,这可以被视为与编译语言(例如C#,C ++等)相比的缺点。这种错误可以在编译时更快地检测到,并且编译器在发现它时会大声尖叫所以你可以注意到它。

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

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

    希望这有帮助!

答案 1 :(得分:2)

解析器在发现您的语法不正确时会引发

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,当检测到一个不属于任何其他类别的错误时会引发该错误

答案 2 :(得分:0)

您有NameError,您的代码应为:

def tofloat(i): 
    return float(i)

Python中没有flt方法,这就是为什么它不适合你。

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

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

使用它:

>>> addnums(range(4))
6.0