2.1.3 Python面向对象之异常处理

点击跳转Python笔记总目录python

Python面向对象之异常处理

1、错误与异常

2、异常处理

3、何时用异常处理


1、错误与异常

程序中不免会出现错误,而错误分为两种git

1.语法错误:(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正)程序员

2.逻辑错误:(逻辑错误),好比用户输入的不合适等一系列错误安全

那什么是异常呢?bash

异常就是程序运行时发生错误的信号,在python中,错误触发的异常以下。异常发生以后,异常以后的代码就不执行了   post

在这里插入图片描述
**异常种类:**在python中不一样的异常能够用不一样的类型(python中统一了类与类型,类型即类)去标识,

不一样的类对象标识不一样的异常,一个异常标识一种错误ui

常见的异常:spa

2、异常处理

1.什么是异常处理?      code

python解释器检测到错误,触发异常(也容许程序员本身触发异常)cdn

程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关)

若是捕捉成功则进入另一个处理分支,执行你为其定制的逻辑,使程序不会崩溃,这就是异常处理

2.为什么要进行异常处理?

python解析器去执行程序,检测到了一个错误时,触发异常,异常触发后且没被处理的状况下,程序就在当前异常处终止,后面的代码不会运行,谁会去用一个运行着忽然就崩溃的软件。

因此你必须提供一种异常处理机制来加强你程序的健壮性与容错性

3.如何进行异常处理

首先须知,异常是由程序的错误引发的,语法上的错误跟异常处理无关,必须在程序运行前就修正 ①使用if判断:

num1=input('>>: ') #输入一个字符串试试
if num1.isdigit():
    int(num1) #咱们的正统程序放到了这里,其他的都属于异常处理范畴
elif num1.isspace():
    print('输入的是空格,就执行我这里的逻辑')
elif len(num1) ** 0:
    print('输入的是空,就执行我这里的逻辑')
else:
    print('其余情状况,执行我这里的逻辑')

''' 问题一: 使用if的方式咱们只为第一段代码加上了异常处理,但这些if,跟你的代码逻辑并没有关系,这样你的代码会由于可读性差而不容易被看懂 问题二: 这只是咱们代码中的一个小逻辑,若是相似的逻辑多,那么每一次都须要判断这些内容,就会倒置咱们的代码特别冗长。 '''
复制代码

总结:

1.if判断式的异常处理只能针对某一段代码,对于不一样的代码段的相同类型的错误你须要写重复的if来进行处理。

2.在你的程序中频繁的写与程序自己无关,与异常处理有关的if,会使得你的代码可读性极其的差

3.if是能够解决异常的,只是存在1,2的问题,因此,千万不要妄下定论if不能用来异常处理。

②python为每一种异常定制了一个类型,而后提供了一种特定的语法结构用来进行异常处理

1.语法:

try:
     被检测的代码块
except 异常类型:
     try中一旦检测到异常,就执行这个位置的逻辑
复制代码

2.异常类只能用来处理指定的异常状况,若是非指定异常则没法处理。

s1 = 'hello'
try:
    int(s1)
except IndexError as e:
    print(e)<br>#没有捕获到异常,程序直接报错
复制代码

3.多分支

## 捕获异常
num= input('num:>>')
try:
    f= open ('file','w')
    ## int(num)
    ## l = []
    ## l[10000]
    ## 1 / 0
    ## dic = {'k': 'v'}
    ## dic['k2']
    print('-----------')
except ValueError :
    print('请输入一个数字')
except NameError as name_e:
    print(name_e)
    print('******=')
except IndentationError as name_e:
    print(name_e)
except IndexError as name_e:
    print(name_e)
except SyntaxError as name_e:
    print(name_e)
except ZeroDivisionError as name_e:
    print(name_e)
except AttributeError as name_e:
    print(name_e)
except KeyError as name_e:
    print(name_e)
## except Exception as e:
## print(e,'异常了')
else: #若是上面出现问题了,就不执行else,若是都正确了就会执行else里的内容(支付过程能够用到else)
    print('else 被执行')
finally:  #不过这段代码出没出问题,都执行这里的内容
    f.close()
print('finally')

复制代码

4.万能异常:能够捕获任意异常

s1 = 'hello'
try:
    int(s1)
except Exception as e:
    print(e)
复制代码

5.主动触发异常

try:
    raise AttributeError('错啦错啦')
except AttributeError as e:
    print(e)
复制代码

6.自定义异常

class EgonException(BaseException):
    def __init__(self,msg):
        self.msg = msg
    ## def __str__(self): 能够不用写这个方法,由于那个BaseException父类里面已经实现了
    ## return self.msg
try:
    raise EgonException('egon出异常啦')
except EgonException as e:
    print(e)

复制代码

7.断言 断言:一个会抛出异常的判断,这个条件一旦成立就成立了,一旦不成立就报错了,就都不执行下面的了

assert 1**2
if 1**2:
    print()
print('haha')
复制代码

try..except的方式比较if的方式的好处

try..except这种异常处理机制就是取代if那种方式,让你的程序在不牺牲可读性的前提下加强健壮性和容错性

异常处理中为每个异常定制了异常类型(python中统一了类与类型,类型即类),对于同一种异常,一个except就能够捕捉到,能够同时处理多段代码的异常(无需‘写多个if判断式’)减小了代码,加强了可读性

使用try..except的方式 1:把错误处理和真正的工做分开来 2:代码更易组织,更清晰,复杂的工做任务更容易实现; 3:毫无疑问,更安全了,不至于因为一些小的疏忽而使程序意外崩溃了;

3、何时用异常处理

try...except应该尽可能少用,由于它自己就是你附加给你的程序的一种异常处理的逻辑,与你的主要的工做是没有关系的

这种东西加的多了,会致使你的代码可读性变差,只有在有些异常没法预知的状况下,才应该加上try...except,

其余的逻辑错误应该尽可能修正

相关文章
相关标签/搜索