python基础课程系列(补充4)

六、异常处理
1.Python异常处理
1)基本的语法介绍
try-except语句:
try:
    do something
except Exception:
    handle error
else:
    pass

@ try 语句是用来捕获异常
@ except语句是用来处理不同的异常,Exception是异常的种类
@ e表示异常的信息
@ else 表示若没有发生异常,当try执行完毕之后,就会执行else

try-except-finally语句:
try:
    do something
except Exception:
    handle error
finally:
    do finally

@ 若try语句是用来捕获异常,若没有发生错误,执行try代码之后,直接执行finally
@ 若try语句捕获到异常,首先执行except部分处理错误,然后才是执行finally
其实finally语句是表示无论是否检测到异常,都会执行finally代码,因此一般我们都会把一些清理的工作,比如关闭文件或者释放资源,放在finally里面.

2)处理异常
先看一下最简单的猜数字的游戏,随机取1-10,然后让你猜:
=======================================================
import random

num = random.randint(1, 10)

while True:
    guess = int(input('Enter 1-10:'))
    if guess > num:
        print('guess Bigger:', guess)
    elif guess < num:
        print('guess Smaller:', guess)
    else:
        print('Great, You guess correct.Game Over')
        break
=======================================================
Enter 1-10:8
guess Smaller: 8
Enter 1-10:9
Great, You guess correct.Game Over
=======================================================
这个是没有异常保护的,若正常输入没有问题,但是若你恶意输入aa,或者是非数字,那就会有问题了:
=======================================================
Enter 1-10:aa
Traceback (most recent call last):
  File "C:\Users\zjhzyjzhaoc1z\Desktop\新建文件夹\test1.py", line 6, in <module>
    guess = int(input('Enter 1-10:'))
ValueError: invalid literal for int() with base 10: 'aa'
=======================================================
所以我们要加入异常处理:
=======================================================
import random

num = random.randint(1, 10)

while True:
    try:
        guess = int(input('Enter 1-10:'))
    except ValueError:
        print('Please enter num:1-10')
        continue
    if guess > num:
        print('guess Bigger:', guess)
    elif guess < num:
        print('guess Smaller:', guess)
    else:
        print('Great, You guess correct.Game over')
        break
=======================================================
Enter 1-10:4
guess Smaller: 4
Enter 1-10:t
Please enter num:1-10
Enter 1-10:7
guess Bigger: 7
Enter 1-10:6
guess Bigger: 6
Enter 1-10:5
Great, You guess correct.Game over

3)python异常错误
3.1.变量或者函数名拼写错误:NameError
访问一个不存在的变量,比如你打印一个从来没有定义过的变量或者你把函数名写错了。
language='Python'
print('Welcome to study:'+Language)
>>NameError: name 'Language' is not defined

3.2.方法名拼写错误:AttributeError
访问一些未知的对象属性,比如字符串里面一些内置函数名我们拼错了
line='Python is easy'
print(line.upperr())
>>AttributeError: 'str' object has no attribute 'upperr'

3.3.列表越界:IndexError
比如我们访问list的时候,索引超过了列表的最大索引
names=['XiaoMing','Lao Wang','Zhang li']
print(names[3])
>>IndexError: list index out of range

3.4.忘记在if/for/while/def 声明末尾添加 :SyntaxError
有的时候写程序写着写着会忘记if/elif/else/for/while/def的末尾加冒号
score=95
if score >90
    print('very good')
>>SyntaxError: invalid syntax

3.5.在循环语句中忘记调用len():TypeError
有时想通过索引来迭代一个list内元素,for循环中我们经常使用range()函数,但是要记得加入len()而不是直接返回这个列表
companies=['Google','Apple','Facebook']
for i in range(companies):
    print(i)
>>TypeError: range() integer end argument expected, got list.

3.6.尝试连接非字符串值与字符串:TypeError
有时想把字符串和数值连接起来一起输入,但是会有问题:
score=82
print('Jack score is: '+str(score))
>>TypeError: cannot concatenate 'str' and 'int' objects

3.7.访问一未初始化的本地变量:UnboundLocalError
在变量使用的时候特别是在函数内部和外部用相同的变量名,经常会犯错不信你看:
x = 10
def func():
    print(x)
    x = 1
    
func()
print('Value of x is', x)
>>UnboundLocalError: local variable 'x' referenced before assignment

注意在函数func()中x是局部变量,因为在函数内部又对x进行了赋值为1,这样全局的x和func()中x就不是一个变量,要么改个名字或者x=1删掉,要么就用加上global,表示func()中的x是用的全局的x
x = 10
def func():
    global x
    print(x)
    x=1

func()
print('Value of x is', x)
>>Value of x is 1

3.8.打开一个不存在的文件:IOError
有的时候我们会访问一个文件,或者定义函数去传入一个文件名,然后去读取
很可能这个文件名根本不存在:
f=open('price.txt')
>>IOError: [Errno 2] No such file or directory: 'price.txt'

3.9.除数为0:ZeroDivisionError
我们在运算一些数值的时候,可能会去引入除数是0的情况,
比如传入一个列表,有可能这个列表中含有0,那么在除的时候就会出错
nums=[10,20,0,30]
for n in nums:
    print(100/n)
>>ZeroDivisionError: division by zero

猜你喜欢

转载自blog.csdn.net/zhaocen_1230/article/details/81866198