小白学 Python(19):基础异常处理

人生苦短,我选Pythonpython

前文传送门git

小白学 Python(1):开篇github

小白学 Python(2):基础数据类型(上)数据库

小白学 Python(3):基础数据类型(下)编程

小白学 Python(4):变量基础操做数组

小白学 Python(5):基础运算符(上)缓存

小白学 Python(6):基础运算符(下)数据结构

小白学 Python(7):基础流程控制(上)函数

小白学 Python(8):基础流程控制(下)测试

小白学 Python(9):基础数据结构(列表)(上)

小白学 Python(10):基础数据结构(列表)(下)

小白学 Python(11):基础数据结构(元组)

小白学 Python(12):基础数据结构(字典)(上)

小白学 Python(13):基础数据结构(字典)(下)

小白学 Python(14):基础数据结构(集合)(上)

小白学 Python(15):基础数据结构(集合)(下)

小白学 Python(16):基础数据类型(函数)(上)

小白学 Python(17):基础数据类型(函数)(下)

小白学 Python(18):基础文件操做

前面咱们已经写了这么多示例代码了,对于报错信息各位同窗可能都已经司空见惯了,今天咱们就来聊一下报错信息的处理。

首先,程序在运行的过程当中,产生了异常,这时,咱们可能会有两种想法,第一种是针对这个异常作某些特殊的处理来进行程序的降级处理;第二种是但愿程序忽略这个异常继续执行下去,这个异常可能并不干扰主逻辑的执行。

那这个时候咱们怎么办呢?

有编程经验的同窗立刻就想到了,那咱们去 try 它啊,在 Python 中,咱们一样能够去 try 它,从字面意思上理解就已经很是清晰明确了,如下的内容是要尝试执行的。

语法:

try:
    ...(可能产生异常的代码)
except:
    ...(产生异常后的处理代码)复制代码

可是,还会有一种状况,无论上面的代码有没有出错,有一部分代码咱们总但愿它能执行,这时,咱们能够添加另外一个关键字 finally

从字面意思能够就能够看出来,这个是最后要执行的意思。

语法:

try:
    ...(可能产生异常的代码)
except:
    ...(产生异常后的处理代码)
finally:
    ...(必定要执行的代码)复制代码

下面开始咱们今天的代码演示。

咱们先拟定一个场景,咱们定义一个除法函数,若是除数不为 0 ,是能够正常返回值的,若是除数为 0 ,那么整个程序确定会直接异常报错。

def division(x, y):
    try:
        return x / y
    except:
        print('程序报错啦!!!')
        return None

print(division(15, 5))复制代码

输出结果以下:

3.0复制代码

这时程序是能够正常输出的,这时咱们修改一下调用的参数,改成 division(15, 0) ,看下输出结果:

程序报错啦!!!
None复制代码

能够看到,这里打印了我在程序中设置的 None ,并无以前的红色的异常信息抛出。这里的 except 会捕捉咱们全部的异常信息,可是,异常信息也是有不少分类的,好比咱们以前遇到过的访问字典中不存在的 key 的异常 KeyError ,好比咱们刚才捕捉到的 ZeroDivisionError 异常,还有也是咱们以前遇到过的数组下标越界的异常 IndexError

好比这里的代码我能够捕捉更加详细的异常信息 ZeroDivisionError

def division1(x, y):
    try:
        return x / y
    except ZeroDivisionError:
        print('程序报错啦!!!')
        return None

print(division1(15, 0))复制代码

输出结果以下:

程序报错啦!!!
None复制代码

那么,看到这里,你可能会有一个疑问,咱们为何要对异常分类,直接抓取全部异常不是更方便么?

固然,对于逻辑比较简单的程序,直接捕捉全部异常是更方便的,可是在某些特定的业务场景下,一段程序可能会抛出多种异常,咱们但愿根据异常种类的不一样,定制不一样的解决方案,至少咱们知道当前的程序是抛出了什么异常,这时,程序异常分类就显得尤其重要。

咱们这里演示一下,若是咱们输出的值不是数字,是字符串的话。。。。

def division2(x, y):
    try:
        return x / y
    except ZeroDivisionError:
        print('您输出的除数为 0 !!!')
        return None
    except TypeError:
        print('您输出的参数类型非法!!!')
        return None

print(division2('python', 0))复制代码

输出结果以下:

您输出的参数类型非法!!!
None复制代码

对的,你没有看错,异常信息是能捕捉多个的,是能够并排写的。至于先抛出那个,就要看那个异常先发生了。

由于示例代码的逻辑过于简单,异常抛出顺序没法演示,请各位同窗见谅(li zhi qi zhuang)。

上面咱们还提到了 finally ,咱们接着来演示 finally 这个关键字的使用。

def division3(x, y):
    try:
        return x / y
    except ZeroDivisionError:
        print('您输出的除数为 0 !!!')
        return None
    except TypeError:
        print('您输出的参数类型非法!!!')
        return None
    finally:
        print('你必定能看到我!!!')

print(division3(15, 3))
print(division3('python', 0))复制代码

能够看到,这里我使用有异常和正常无任何问题的数据进行测试,结果以下:

你必定能看到我!!!
5.0
您输出的参数类型非法!!!
你必定能看到我!!!
None复制代码

确实, finally 中的内容是能正常打印的,这里多提一句,这里常常的使用方式是来关闭一些 I/O 读写操做或者一些外部链接,如数据库、缓存服务等。

今天的内容就到这里,各位同窗请回去自行尝试。

示例代码

本系列的全部代码小编都会放在代码管理仓库 Github 和 Gitee 上,方便你们取用。

示例代码-Github

示例代码-Gitee

若是个人文章对您有帮助,请扫码关注下做者的公众号:获取最新干货推送:)
相关文章
相关标签/搜索