Python基础-异常处理

时间:2024-11-17 20:25:40

异常是写代码的过程中经常出现的问题,也是软件构建、跟用户交互必不可少的重要内容。
在实际生活中,如果用户没有按照软件代码预想的方式进行操作,导致代码出现异常报错,就需要进行很好的异常处理,引导用户以正确方式使用软件。

异常处理主要分为以下内容:
在这里插入图片描述

一、异常也是一种对象

  • 异常是一种Python用来管理程序执行期间发生错误的一种特殊对象;
  • 异常有很多常见类型,在上图中有所穷举,适当记住一些可协助自己在写代码的过程中快速理解报错原因,高效的修改代码;
  • 异常之间有些存在一定的包含关系;

二、异常的处理

1. try-except

(1)一个try VS 一个except

try:
要检测的东西(一般是怀疑可能出现报错的内容)
except Exception(一般是怀疑可能的报错类型):
与怀疑的报错一致时的处理代码

举例:
以处理ZeroDivisionError异常为例

try:
    print(5/0)
except ZeroDivisionError :
    print('Zero can not be divided')
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

(2)一个try VS 多个except

同一个try后可带有多个except,但最多只会有一个分支被执行;且当有包含关系的两种报错类型分别在两个except语句中出现,则谁先出现执行谁;

举例:
查询错误包含键错误和值错误,如果查询错误和键错误同时出现在一个try的两个except分支,则若查询错误在前,执行查询错误分支;若键错误在前,执行键错误分支;

dict1 = {'a': 1, 'b': 2, 'v': 22}
try:
    x = dict1['y']
except KeyError:
    print('键错误')
except LookupError:
    print('查询错误')
else:
    print(x)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

dict1 = {'a': 1, 'b': 2, 'v': 22}
try:
    x = dict1['y']
except LookupError:
    print('查询错误')
except KeyError:
    print('键错误')
else:
    print(x)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

(3)一个try VS 一个except包含多种异常类型

将多个可能的报错类型放在一个except里面,这些异常将被放在一个括号里成为一个元组

try:
    s = 1 + '1'
    int("abc")
    f = open('')
    print(f.read())
    f.close()
except (OSError, TypeError, ValueError) as error:
    print('出错了!\n原因是:' + str(error))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

2. try-except-else

如果在try子句执行时没有发生异常,Python将执行else语句后的语句。
注意:else语句的存在必须以except语句的存在为前提,在没有except语句的try语句中使用else语句,会引发语法错误。

#执行except代码块后继续执行后续代码的例子
print('Please Enter two numbers')
print('Enter "q" to quit')

while True:
    first_number=input('\nFirst number:')
    if first_number=='q':
        break
    second_number=input('\nSecond number:')
    if second_number=='q':
        break 
    try:
        answer=int(first_number)/int(second_number)
    except ZeroDivisionError:
        print('Zero cannot be divided. Please try another number')
    else:   #依赖于try代码块成功执行的代码都放在else中
        print(answer)
#使用时要格外注意缩进的对齐
#这种方法一方面对用户更友好,另一方面对代码本身也更安全
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

在这里插入图片描述

3. try-except-finally

不管try子句里面有没有发生异常,finally子句都会执行。
如果一个异常在try子句里被抛出,而又没有任何的except把它截住,那么这个异常会在finally子句执行后被抛出。

def divide(x,y):
    try:
        result=x/y
        print('result is:',result)
    except ZeroDivisionError:
        print('division by zero!')
    finally:
        print('executing finally clause')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

输入正确的分子分母时,正常执行,并执行finally后内容:

divide(1,2)
  • 1

在这里插入图片描述

输入内容抛出except可捕捉的异常时,执行except后内容和finally后内容:

divide(1,0)
  • 1

在这里插入图片描述
输入内容抛出的异常不在except可捕捉范围时,先执行finally后内容,然后再抛出异常:

divide('2','1')
  • 1

在这里插入图片描述

4. raise——抛出异常

try:
    raise NameError('HiThere')
except NameError:
    print('An exception flew by!')
#先抛一个异常,这个异常在except里找到了对应的代码,则执行,于是输出print后的内容
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

三、练习

题目描述:

电脑产生一个1到10之间的随机数字,然后让用户来猜,如果用户猜的数字比这个数字大,提示太大,否则提示太小,当用户正好猜中电脑会提示,“恭喜你猜到了这个数是…”。在用户每次猜测之前程序会输出用户是第几次猜测,如果用户输入的根本不是一个数字,程序会告诉用户"输入无效"。

(尝试使用try catch异常处理结构对输入情况进行处理)

获取随机数采用random模块。

题目分析:本质是一个循环问题,需利用try对用户输入内容做特殊处理

#导入生成随机数的包
import random 

#先定义count,用 count标记执行次数
count=0
random=random.randint(1,10) #随机生成一个1-10之间的整数
while True:   #While True会使程序不停循环,直至预见break后跳出
    temp=input('请输入:')  #先提示输入内容
    if temp=='q':    #怕循环太久,指定一个默认字符和直接跳出结束程序,避免一直猜不到又一直要循环
        count=count+1
        print(count)
        break   #如遇输入q,则跳出循环,结束
    else:   #如果输出的不为q,则按正常流程判断输入值和random值的大小
        try:   #由于输入的可能不为要求的数值型数据,因此此处存在报错可能性,引入try
            guess=int(temp)
        except ValueError:   #捕捉对应的报错类型
            print('输入的不是整数数字,请重新输入')
        else:      #else后是try后内容如果正常的情况下,要执行的内容;如果输入的是正常数值型数据,则继续判断
            if guess>random: #如果猜测值比random大,则提示再输入小一点的数字
                print('再小一点')
                count=count+1   #count累加
                print(count)    #执行一次,输出一次count计数
            elif guess<random:
                print('再大一点')
                count=count+1
                print(count)
            else:   
                print('恭喜你答对了!正确数字是:',random)
                break   #答对后自动跳出循环
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

在这里插入图片描述

需要注意的是:在混用使用try-except和条件/循环结构时,一定要注意缩进,不然也会抛出缩进异常的错误

在这里插入图片描述