新⼿学Python时常见的语法错误和异常(Python基础)
⼤家好,今天我们简单介绍下在学习Python时常见的⼀些错误和异常。
记得刚接触Python的时候,⼀条简单的语句在执⾏的时候却总能遇到报错。然后各种艰难的复查发现可能是循环语句缺少冒号啊、⽤了中⽂的标点符号啊、引号/括号等少了⼀个或者⽆法匹配啊、函数⽅法或变量名拼写错误啊等等。
在Python编程中有两种可区分的报错:语法错误 和 异常。
语法错误⼜称解析错误,是我们在刚接触学习Python 时最容易遇到的错误,区区别于异常⽽⾔,语法错误⾮程序执⾏时的逻辑错误;
即使语句或表达式在语法上是正确的,但在尝试执⾏时,它仍可能会引发错误,⽽这个在执⾏时检测到的逻辑错误被称为异常。
1.语法错误
语句本⾝的语法存在问题,常见的有循环语句后⾯少了冒号、⽤了中⽂的标点符号、字符串赋值时引号少⼀个等等,属于⾮逻辑错误。
In [1]: for i in range(10)
...: print(i)
File "<ipython-input-1-696a89bc759f>", line 1
for i in range(10)
^
SyntaxError: invalid syntax
在这个例⼦中,for循环遗漏了⼀个冒号。解析器会输出出现语法错误的那⼀⾏,并显⽰⼀个“箭头”,指向这⾏⾥⾯检测到的第⼀个错误。错误是由箭头指⽰的位置 上⾯ 的 token 引起的(或者⾄少是在这⾥被检测出的):在⽰例中,在 print() 这个函数中检测到了错误,因为在它前⾯少了个冒号 (':') 。⽂件名和⾏号也会被输出,以便输⼊来⾃脚本⽂件时你能知道去哪检查。
In [2]: for i in range(10):
...: print(i)
File "<ipython-input-7-6f0e28cee45c>", line 1
for i in range(10):
^
SyntaxError: invalid character in identifier
在这个例⼦中,for循环后⾯我们错误使⽤了中⽂字符冒号(:),在错误类型后⾯的提⽰invalid character in identifier也说的很明确,就是标识符中⽤了⽆效的字符。
In [3]: s = 'a
File "<ipython-input-2-2674c3b7142b>", line 1
s = 'a
^
SyntaxError: EOL while scanning string literal
fusioaccess下载python基础知识测试
在这个例⼦中,赋值字符串少了⼀个引号。在错误类型后⾯其实有提⽰EOL while scanning string literal,直译就是字符串扫描的时候EOL 了吧。
2.异常
异常是在程序执⾏过程中发⽣的逻辑错误,⼤多数异常并不会被程序处理,⼤多数异常并不会被程序处理,此时会显⽰如下所⽰的错误信息:
In [4]: 1/0
Traceback (most recent call last):
File "<ipython-input-8-9e1622b385b6>", line 1, in <module>
1/0
ZeroDivisionError: division by zero
In [5]: 1+2*varactivex控件如何安装
Traceback (most recent call last):
File "<ipython-input-9-fa55356f14f5>", line 1, in <module>
1+2*var
NameError: name 'var' is not defined
In [6]: 1+'2'
Traceback (most recent call last):
File "<ipython-input-10-7e3aa5c4fbef>", line 1, in <module>
1+'2'
TypeError: unsupported operand type(s) for +: 'int' and 'str'
错误信息的最后⼀⾏告诉我们程序遇到了什么类型的错误。异常有不同的类型,⽽其类型名称将会作为错误信息的⼀部分中打印出来:上述⽰例中的异常类型依次是:ZeroDivisionError, NameError 和 TypeError。作为异常类型打印的字符串是发⽣的内置异常的名称,这⼀⾏的剩下的部分根据异常类型及其原因提供详细信息。
错误消息的开头部分以堆栈回溯的形式显⽰发⽣异常的上下⽂:通常它会包含列出源代码⾏的堆栈回溯;但是,它将不会显⽰从标准输⼊读取的⾏。
异常说明
拿1/0为例,我们知道0是⽆法作为除数的,这⾥就存在逻辑错误。在错误信息中,我们发现这是⼀个ZeroDivisionError异常类型,其发⽣异常的是代码第1⾏1/0位置,具体解释是division by zero(除数为0)。
2.1.常见的异常
NameError:当某个局部或全局变量在使⽤前未被定义时
In [7]: 1+2*var
Traceback (most recent call last):
File "<ipython-input-9-fa55356f14f5>", line 1, in <module>
1+2*var
NameError: name 'var' is not defined
变量var在参与运算之前没有被定义,因此出现该异常提⽰。我们只需要在此代码前对var进⾏定义,⽅可正常执⾏后续代码。另外,我们在初学的时候,容易出现对变量名拼写错误,导致⾃以为已经定义但是依旧出现这个报错的情况:⽐如定义var=2,实际使⽤的时候是1+war的情况。
TypeError:当⼀个操作或函数被应⽤于类型不适当的对象时
In [6]: 1+'2'
Traceback (most recent call last):
File "<ipython-input-10-7e3aa5c4fbef>", line 1, in <module>
1+'2'
TypeError: unsupported operand type(s) for +: 'int' and 'str'
对于运算符+的操作,不⽀持int和str,这个时候检查出现的变量类型即可完成⾃查。
IndentationError:当出现缩进不当时
In [7]: for i in range(10):
...: print(i)
File "<ipython-input-6-0c8aafc23d7e>", line 2
print(i)
^
IndentationError: expected an indented block
在for循环后⾯的语句,应为缩进模块,但是这⾥并没有进⾏合理缩进,故⽽出现报错。
AttributeError:当试图使⽤⼀个对象没有的属性或⽅法时
In [8]: dic = {'key1':'var1',
...: 'key2':'var2'}
In [9]: dic.append('a')
Traceback (most recent call last):
File "<ipython-input-11-611a9bdb0662>", line 1, in <module>
dic.append('a')
AttributeError: 'dict' object has no attribute 'append'
⽐如我们定义⼀个字典dic,但是对它使⽤了列表的⽅法append,这个时候就会出现报错提⽰dict没有⽅法append。出现类型错误的时候,查看对象是否有想使⽤⽅法,或者查看⼀下你的⽅法拼写是否正确。
IndexError:当序列下标索引超出范围时
In [10]: lis = [1,2,3,4,5]
In [11]: lis[6]
Traceback (most recent call last):
File "<ipython-input-13-8eaf39d436a7>", line 1, in <module>
lis[6]
IndexError: list index out of range
对于列表lis⼀共5个元素,若我们试图访问第7个元素也就是lis[6]时会出现 列表超出了范围的提⽰。通常我们在编写循环,访问序列元素的时候容易出现此类越界问题。
KeyError:当试图访问字典中不存在的键时
In [12]: dic = {'key1':'var1',
...: 'key2':'var2'}
In [13]: dic['key1']
cassandra naudOut[13]: 'var1'
In [14]: dic['key']
Traceback (most recent call last):
File "<ipython-input-15-0b90da6672e1>", line 1, in <module>
dic['key']
KeyError: 'key'
在字典dic中,我们并没有key这个键,若我们试图访问不存在的键就会提⽰ KeyError: 'key',此时我们复查key是否存在即可。
ModuleNotFoundError:ImportError 的⼦类,当⼀个模块⽆法被定位时将由 import 引发
In [15]: import docxtpl
Traceback (most recent call last):
File "<ipython-input-22-bfd93c61f778>", line 1, in <module>
import docxtpl
六阶魔方教程图解ModuleNotFoundError: No module named 'docxtpl'
我们引⼊模块不存在的时候,会出现此报错,这个时候可以检查模块的名称拼写是否正确或者进⾏模块的安装(pip install docxtpl)。
ImportError:当我们试图引⼊不存在的库时,并且当 from ... import 中的 "from list" 存在⽆法到的名称时
In [16]: from os import x
Traceback (most recent call last):
File "<ipython-input-20-a0857005ff12>", line 1, in <module>
from os import x
ImportError: cannot import name 'x' from 'os' (C:\Users\Gdc\anaconda3\lib\os.py)
⽐如随便写的这个从os中import x,实际上不存在。
ValueError:当操作或函数接收到具有正确类型但值不适合的参数
In [17]: num = int(input('请输⼊⼀个整数:'))
请输⼊⼀个整数:a
Traceback (most recent call last):
File "<ipython-input-23-9c8264b2c0f9>", line 1, in <module>
num = int(input('请输⼊⼀个整数:'))
ValueError: invalid literal for int() with base 10: 'a'
⽐如当我们使⽤int对输⼊对象进⾏转化为整数时,输⼊的对象是字符串时,这是⼀个不合适的参数。
KeyboardInterrupt:当⽤户按下中断键 (通常为 Control-C 或 Delete) 时
In [18]: num = int(input('请输⼊⼀个整数:'))
请输⼊⼀个整数:Traceback (most recent call last):
File "<ipython-input-24-9c8264b2c0f9>", line 1, in <module>
num = int(input('请输⼊⼀个整数:'))
File "C:\Users\Gdc\anaconda3\lib\site-packages\ipykernel\kernelbase.py", line 860, in raw_input
return self._input_request(str(prompt),
File "C:\Users\Gdc\anaconda3\lib\site-packages\ipykernel\kernelbase.py", line 904, in _input_request
raise KeyboardInterrupt("Interrupted by user") from None
KeyboardInterrupt: Interrupted by user
当程序执⾏过程中,我们使⽤ Control+C 或 Delete时,就会出现中断程序的提⽰,我常常在程序执⾏过程中想复制部分打印信息的时候错使⽤ Control+C想着复制却使得程序中断的情况。
3.遇到错误和异常时怎么办?
其实,⼤部分的报错信息都有很明显的指引,已经具体到某⾏具体什么类型的错误以及对错误⽐较清晰的解释。
遇到报错不要慌,对于新⼿来说,常见的就是先检查基础语法对不对、标识符是不是⽤了中⽂,变量
名的拼写是不是错了,变量名是不是没定义就调⽤了,缩进是不是没整对,函数⽅法是不是⽤错了,想引⼊的库是不是没有安装等等。
再就是复制报错信息,然后丢到搜索引擎⾥查!!基本上绝⼤多数报错都有⼈遇到过且在⽹上能到相关的解决⽅案!!
4.标准异常查询
异常名称描述
BaseException所有异常的基类
SystemExit解释器请求退出
KeyboardInterrupt⽤户中断执⾏(通常是输⼊^C)
Exception常规错误的基类
StopIteration迭代器没有更多的值
GeneratorExit⽣成器(generator)发⽣异常来通知退出
StandardError所有的内建标准异常的基类
ArithmeticError所有数值计算错误的基类
FloatingPointError浮点计算错误
OverflowError数值运算超出最⼤限制
ZeroDivisionError除(或取模)零 (所有数据类型)
AssertionError断⾔语句失败
AttributeError对象没有这个属性
EOFError没有内建输⼊,到达EOF 标记
EnvironmentError操作系统错误的基类excel函数不显示结果只显示公式
IOError输⼊/输出操作失败
OSError操作系统错误
WindowsError系统调⽤失败
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论