chzhiyi / -KnowledgeShare

6 stars 1 forks source link

20190222 - Python中的错误和异常 - jingchu #18

Open qingfengmingjian opened 5 years ago

qingfengmingjian commented 5 years ago
错误:Python 的语法错误或者称之为解析错,是初学者经常碰到的
异常:即便Python程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常。

大多数的异常都不会被程序处理,都以错误信息的形式展现

一个简单的异常

a=[bailian]

Traceback (most recent call last):
 File "D:\Users\荆楚\Desktop\python\input\input.py", line 18, in <module>
  a=[bailian]
NameError: name 'bailian' is not defined

异常处理:

基础语法:try-except
try语句按照如下方式工作;

首先,执行try子句(在关键字try和关键字except之间的语句)
如果没有异常发生,忽略except子句,try子句执行后结束。
如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的except子句将被执行。最后执行 try 语句之后的代码。
如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中。
一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。
一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组

try:
    a=[bailian]
except NameError:
    print('对象未声明类型')
    a=['bailian']
    print(a[0])

对象未声明类型
bailian

try-except-else

#######如果使用else,那么else必须放在所有的except子句之后

使用 else 子句比把所有的语句都放在 try 子句里面要好,这样可以避免一些意想不到的、而except又没有捕获的异常
代码存在异常,不执行else语句
try:
    a=[bailian]
except NameError:
    print('except后面不能为空')
    print('对象未声明类型')
    a=['bailian']
    print(a[0])
else:
    print['发生异常不打印,没有异常打印']

except后面不能为空
对象未声明类型
bailian
[Finished in 0.1s]

没有异常执行else语句

try:
    a=['bailian']
except NameError:
    print('except后面不能为空')
    print('对象未声明类型')
    a=['bailian']
    print(a[0])
else:
    print('发生异常不打印,没有异常打印')

发生异常不打印,没有异常打印

try-except-finally

无论是否出现异常,finally语句都要执行

有异常,执行finally语句

try:
    a=[bailian]
except NameError:
    print('except后面不能为空')
    print('对象未声明类型')
    a=['bailian']
    print(a[0])
else:
    print['发生异常不打印,没有异常打印']
finally:
    print('这是一定会执行的语句')

except后面不能为空
对象未声明类型
bailian
这是一定会执行的语句
[Finished in 0.1s]

没有异常,执行finally语句

try:
    a=['bailian']
except NameError:
    print('except后面不能为空')
    print('对象未声明类型')
    a=['bailian']
    print(a[0])
else:
    print('发生异常不打印,没有异常打印')
finally:
    print('这是一定会执行的语句')
发生异常不打印,没有异常打印
这是一定会执行的语句

抛出异常

#########使用 raise 语句抛出一个指定的异常,raise 唯一的一个参数指定了要被抛出的异常

try:
    raise NameError('主动抛出一个异常')
except NameError:
    print('An exception flew by!')
    raise

An exception flew by!
Traceback (most recent call last):
File "D:\Users\荆楚\Desktop\python\input\input.py", line 3, in <module>
raise NameError('主动抛出异常')
NameError: 主动抛出异常