欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python基础-异常处理

程序员文章站 2024-03-18 12:17:16
...

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

异常处理主要分为以下内容:
Python基础-异常处理

一、异常也是一种对象

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

二、异常的处理

1. try-except

(1)一个try VS 一个except

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

举例:
以处理ZeroDivisionError异常为例

try:
    print(5/0)
except ZeroDivisionError :
    print('Zero can not be divided')

Python基础-异常处理

(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)

Python基础-异常处理

dict1 = {'a': 1, 'b': 2, 'v': 22}
try:
    x = dict1['y']
except LookupError:
    print('查询错误')
except KeyError:
    print('键错误')
else:
    print(x)

Python基础-异常处理

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

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

try:
    s = 1 + '1'
    int("abc")
    f = open('test.txt')
    print(f.read())
    f.close()
except (OSError, TypeError, ValueError) as error:
    print('出错了!\n原因是:' + str(error))

Python基础-异常处理

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)
#使用时要格外注意缩进的对齐
#这种方法一方面对用户更友好,另一方面对代码本身也更安全

Python基础-异常处理

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')

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

divide(1,2)

Python基础-异常处理

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

divide(1,0)

Python基础-异常处理
输入内容抛出的异常不在except可捕捉范围时,先执行finally后内容,然后再抛出异常:

divide('2','1')

Python基础-异常处理

4. raise——抛出异常

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

Python基础-异常处理

三、练习

题目描述:

电脑产生一个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   #答对后自动跳出循环

Python基础-异常处理

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

Python基础-异常处理

相关标签: python基础 python

上一篇: Python基础——异常处理

下一篇: