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:
	不管有没有异常都会执行的代码