Python异常捕获详解(入门)

捕获异常

程序运行会抛出异常,以下将介绍怎样捕获异常使得程序不中断以及处理异常

try-except语句

最基础的捕获异常是通过try-except组合语句实现的

基本语法格式:

try:
    <可能会抛出异常的语句>
except [猜测异常类型]:
    <处理异常的代码>

1)try:
顾名思义——尝试,把你觉得可能报错的语句写在try内,就算有异常也不会暂停程序

2)except:
类似else语句,是为了处理异常的,你需要猜测异常的类型,如:TypeErrorValueError等,注意异常类型是大小写区别的,TypeError和typeerror不是一回事

如果try中发现异常,那么就要走except语句,分析异常并处理;如果没有异常,就不走except,直接跳过,try中的语句正常执行

来来来,注意看一个实验:
第一个代码

# -*- coding: UTF-8 -*-
#!/usr/bin/python3

import datetime as dt

def read_date(in_date):
    try:
        date = dt.datetime.strptime(in_date, '%Y-%m-%d')
        return date
    except ValueError:
        print("ValueError!")

str_date = '2018-8-18'
print("日期 = {0}".format(read_date(str_date)))

这个程序输出的很正常,因为2018-8-18没有任何问题,所以就正常的执行了try语句,没有走except语句,输出结果如下:

日期 = 2018-08-18 00:00:00

但是你把str_date改成'201B-8-18'

这就有问题了,输出如下

ValueError!
日期 = None

这样try语句抛出异常,无法正确执行,只能走except语句,所以输出了处理异常语句

如果你还想要异常对象,就是异常的报错,还可以修改代码

def read_date(in_date):
    try:
        date = dt.datetime.strptime(in_date, '%Y-%m-%d')
        return date
    except ValueError as e:
        print("ValueError!")
        print("异常对象:", e)

那么输出:

ValueError!
异常对象: time data '201B-8-18' does not match format '%Y-%m-%d'
日期 = None

as关键字

这个关键字,可以把一个长的名称简化,也可以实现带入功能

比如:

import datetime
datetime.datetime.today()

可以调用datetime模块datetime类的today方法,我们可以用from简化

from datetime import datetime
datetime.today()

这样又减少了,再用as简化

from datetime import datetime as dt
dt.today()

这样可以把datetime简化成一个比较短的单词dt,意思不变

还可以把异常信息用as带入一个字符串,就像刚才那样。

多层except代码块

捕获异常可以有多重异常,那么就像elif一样,可以有多重except语句块。

格式如下:

try:
    <语句>
except [异常类型1]:
    <处理异常>
except [异常类型2]:
    <处理异常>
...

也可以把所有的异常放在一个元组中,如下:

# coding: UTF-8
import datetime as dt
def read_date_from_file(filename):
    try:
        file = open(filename)
        in_date = file.read()
        in_date = in_date.strip()
        date = dt.datetime.strptime(in_date, '%Y-%m-%d')
        return date
    except (ValueError, OSError) as e:
        print('调用method1处理...')
        print(e)

释放资源

try和except中的语句会占用一些资源,如打开文件、网络连接、打开数据库和使用数据等这些资源不能通过垃圾回收机制收回,可以用finally关键字回收

finally就是无论try中的语句可以执行还是不可以执行都会在结束时走一下finally中的回收语句。

try:
    <可能会抛出异常的语句>
except [异常类型1]:
    <处理异常>
except [异常类型2]:
    <处理异常>
...
except [异常类型n]:
    <处理异常>
finally:
    <释放资源>

实例:

def finally_f(filename)
    try:
        file = open(filename)
    except ValueError as e:
        print('Value!')
    except OSError as e:
        print('OS!')
    finally:
        file.close()

就这么简单!

猜你喜欢

转载自blog.csdn.net/cool99781/article/details/106124052