Python 有两种错误很容易辨认:语法错误和异常
一、语法错误
所谓语法错误就是:用法错误。
>>> a = 123aaa
File "<stdin>", line 1
a = 123aaa
^
SyntaxError: invalid syntax
二、异常
即便 Python 程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常。
三、异常的处理流程
try:
代码
except:
当发生了异常,执行此处代码
执行过程:
首先,执行 try 子句(在关键字 try 和关键字 except 之间的语句)。
如果没有异常发生,忽略 except 子句,try 子句执行后结束。
如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行。
如果一个异常没有与任何的 except 匹配,那么这个异常将会传递给上层的 try 中。
1.单个异常:
>>> print(test)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'test' is not defined
这里的错误是NameError
那么我们就可以捕获这个错误
#!/usr/bin/python3
try:
print(test)
except NameError:
print('名字错误')
[root@node7 python]# python3 test.py
名字错误
存在的我问题,如果我们不知道报错的类型或者这里匹配的错误和代码报错不一致,except就是失败,或者将异常返回给上一层的try
[root@node7 python]# cat test.py
#!/usr/bin/python3
try:
print(test)
except ValueError:
print('名字错误')
[root@node7 python]# python3 test.py
Traceback (most recent call last):
File "test.py", line 3, in <module>
print(test)
NameError: name 'test' is not defined
2.多个异常
一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组,例如
except (RuntimeError, TypeError, NameError):
pass
3.通配异常
上边的两种情况都存在的问题:就是我们要预先想到程序可能会报什么错误,或者报错的类型然后去匹配它,如果匹配不到,异常(except)就会捕获失败,对应的语句也就不会执行.这时候就体现到了except统配的优点了
#!/usr/bin/python3
try:
print(test)
except:
print('通配到了错误')
或者
#!/usr/bin/python3
try:
print(test)
except Exception:
print('通配到了错误')
[root@node7 python]# python3 test.py
通配到了错误
四、else
tyr:
要执行的代码
except:
如果上边的代码出现了错误,并且except匹配到了异常,就会执行此处代码
else:
如果没有异常时,就会执行此处的代码
五、finally
tyr:
要执行的代码
except:
如果上边的代码出现了错误,并且except匹配到了异常,就会执行此处代码
else:
如果没有异常时,就会执行此处的代码
finally:
不管有没有异常都会执行的代码