Python实用教程系列——异常处理

image

前几篇文章写的是关于Xlwings的相关知识,介绍了其相关API的使用方法,大家在使用Xlwing对Excel进行操作的时候,就可以使用推文中介绍的方法完成自己的任务。关于其与VBA的结合的使用,等后期遇到比较好项目的时候我再跟大家介绍。

从现在开始,将开启新的写作《Python实用教程系列》,主要是针对自己在项目中,对那些平时使用频率较高的,觉得重要的知识点进行总结和归纳,以更好的帮助大家在写代码的时候起到举一反三的作用,闲话不多说,这个系列的开篇我们就从-异常处理讲起!

百度百科中对异常处理的介绍为:异常处理,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况(即超出程序正常执行流程的某些特殊条件)。从这个角度来看,异常处理是保证程序正常运行关键,因此异常处理是非常重要的!

在Python中,处理异常的基类是:BaseException,各个异常具体如下所示:

image

一、异常分类

基类BaseException中有一个异常类Warning,这个Warning我们应该遇见的次数很多了,比如我们在运行代码的时候,比如某一个要模块版本过低的时候会出现这样的告警。

记下来我们来介绍上述所列的几个常见异常:

image

1. AttributeError

class Car():    def __init__(self):        self.car_lenth = 3.5        self.car_height = 1.7        self.car_name = 'Benz'new_car = Carprint(new_car.car_width)

上述代码最后一行代码试图访问不存在的属性car_width,这将抛出一下的异常:

AttributeError: type object 'Car' has no attribute 'car_width'

2. IndexError

def len_list(number):    print(number[len(number)] + 1)len_list([1,2,3,4,5])

上述代码试图访问超出列表的索引进行取值,这将抛出异常:

IndexError: list index out of range

3. KeyError

def visit_dic(dic_num):    print(dic_num['4'])dic_123 = {'1':'我', '2':'爱', '3':'python学堂'}visit_dic(dic_123['4'])

上述代码试图访问字典dic_123中不存在的键值,这将抛出KeyError: '4'异常

4. NameError

def name_err():    print(name)name_err()

上述代码中,函数name_err()中试图打印不存在的name对象,将抛出异常:

NameError: name 'name' is not defined

5. OSError

def open_file(filename):    file=open(filename)file = r'C:\Users\TEN\Desktop\'1.txt'open_file(file)

上述代码试图打开桌面一个不存在的文件1.txt,这将抛出OSError异常:

FileNotFoundError:[Errno2]No such file or directory:

"C:\Users\TEN\Desktop\'1.txt"

值的一提的是在python3.3版本以后,IOError(有关于输入输出的异常)将并到OSError中,看上述Xmind图可知FileNotFoundError属于OSError类。

6. SyntaxError

def syn_error():    print('python知识学堂')    print('今天天气好)syn_error()

上述代码第二行的print打印测时候,少了一个“’”,将抛出异常:

SyntaxError: EOL while scanning string literal

7. TypeError

def add_number(parameter1, parameter2):    sum = parameter1 + parameter2    return sumtotal = add_number(1, 2, 3)print(total)

上述代码的函数add_number接受2个参数,第五行代码传入了3个参数,这将抛出类型错误的异常:

TypeError: add_number() takes 2 positional arguments but 3 were given

综上,我们看了7种类型的异常。那么很显然想到的就是,出现的这些异常我们该怎么处理呢?接下来我们就将介绍处理异常的一些方法:

二、Try-except

异常是使用try-except来进行处理的,使用try-except的好处就是可以让python执行指定的操作,可以人为定义一些面向用户友好的一些错误信息,帮助用户定位错误。在实际的项目中,我们把可能出现异常的代码块放在try中,以便排除异常并保证其余代码正常运行而不退出。

比如我们使用try-except处理一个ZeroDivisionError异常:

try:    print(100/0)except ZeroDivisionError:    print('分母不能为0')

这里出现错误的代码被放在了try中,如果try中的代码没有问题,python将跳过except中的代码;如果try中的代码出现问题,则会执行except中的代码。

这里有一个技巧,就是else模块的使用,比如:

try:    print(100/1)except ZeroDivisionError:    print('分母不能为0')else:    print('python')

上述代码输出:100.0,python。使用else的好处就是可以让代码继续执行,即使遇到一些可能的错误,作为一种选择性的继续执行时非常nice的。

在抛出异常的时候,我们可以使用except error_type as errorname:的形式,那么使用print(errorname)就可以打印异常对象了,十分方便。

try:    print(100/0)except ZeroDivisionError as zeror:    print('分母不能为0')    print(zeror)else:    print('python')

三、多except

在实际的项目中,我们在一段代码中需要处理的异常不只一个,比如要同时处理ArithmeticErrorValueErrorArithmeticErrorZeroDivisionError的父类,这个时候我们就可以使用多Try-except方法了,该方法就可以进行多重异常的捕获了哦。

try:    file = open(r'C:\Users\TEN\Desktop\1.txt')  # 桌面不存在文件1.txt    print(100/0)    print(100/2)except ZeroDivisionError as zeror:    print('分母不能为0')except FileNotFoundError as fn:    print(fn)    print('python')else:    print('运行结束')

程序正常运行且上述代码输出:

[Errno 2] No such file or directory: "C:\Users\TEN\Desktop\'1.txt"

python

上述代码使用多个except来进行不同的异常处理,大家可以好好研究一下其中的打印为什么是这样。

四、嵌套Try-except

在实际的项目中我们可能还会遇到这样的情况:在一个try-except中处理了一个异常,在这个异常处理之中我们还要进行异常的处理,此时就需要使用嵌套Try-except了,正好python中也是支持这个嵌套的。我们来看一个实际的例子,来感受一下:

def trying_test():    try:        try:            print(100/0)        except:            print('分母不能为0')        try:            file = open(r'C:\Users\TEN\Desktop\1.txt')        except FileNotFoundError as fn:            print(fn)    except:        print('python')    finally:        print('最后的打印')trying_test ()

上述代码运行输出:

分母不能为0

[Errno 2] No such file or directory: "C:\Users\TEN\Desktop\'1.txt"

最后的打印

上述两个嵌套的try-except被嵌套在第一个代码中,精确的说就是两个try-except被放在try代码块中,当然了实际的开发中我们也可与将要被嵌套的try-except放在except的代码块中。Python的traceback提供了一个print_exc()函数可以帮助我们打印一些异常的信息,有兴趣的小伙伴可以查阅一下相关的文档。

有的小伙伴注意到上述中有一个finally,这个finally的一个好处就是在异常抛出的之后,这个finally总会执行的,比如在诸如打开文件、写数据到文件的操作失败的时候就可以进行关闭文件的操作。

五、With-as

我们在看其他人代码的时候,会看到这样的代码:with open(filename) as f 的样式。使用with语句的好处,就是到达语句末尾时,会自动关闭文件,这就不需要使用try-except的方式捕捉异常进行关闭文件的操作了。

如果直接使用open()方法打开文件,如果出现异常,如读取过程中文件不存在或异常,则直接出现错误,close方法无法执行,文件无法关闭的,我们来看看使用with open…的方式:

def open_file(filename):    try:        with open(filename) as f:            file = open(filename)            print('文件名:',file.name)    except OSError as E:        print('open file error')filename = r'C:\Users\TEN\Desktop\1.txt'open_file(filename)

六、异常类的定义

在实际的工程项目中,我们有时候需要定义一个区别于系统的异常类,还好python提供了一个可以自己定义异常类的方法,我们来看下面的代码:

# 自定义异常类,继承于Exception基类class Division_Error(Exception):    # 当输出有误时,抛出此异常    # 初始化    def __init__(self, value, name):        self.value = value        self.name = name    # 返回异常类对象的相关信息    def __str__(self):        if self.value % 2 != 0 and len(self.name) < 5:            return ("{}不是偶数,{}长度小于4".format(self.value,self.name) )try:    # 抛出异常    print('尝试显示抛出异常')    diverr = Division_Error(1,'name')    raise diverr    #或raise Division_Error(1,'name')'except Division_Error as diverr:    print('diverr: {}'.format(diverr))

上述代码中自定了一个继承于基类的Division_Error类,用于抛出一些异常,在try的代码块中,我们使用raise用于显示的抛出异常。

七、总结

上述就是Python中异常处理的相关知识了,介绍了python中几个异常的类型以及使用小例子具体介绍了他们的用法,接着我们介绍了异常的处理方法,这些方法在实际的项目中都非常的实用,小伙伴们可以参考其中的一些介绍进行实际的操作。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容