python全局注解tryexcept_linuxea:python异常处理(1)

I. 一,什么是异常处理

异常处理中,有语法错误和逻辑错误

异常是程序运行时发生错误的信号,如,崩溃的结果

如下:

Traceback (most recent call last):

File "D:/python3-3/异常/一场类型.py", line 1, in

aa

NameError: name 'aa' is not defined

注解:

aa: 引发异常的错误

Traceback:异常的追踪信息

NameError: 异常类

name 'aa' is not defined :异常值

1.2 异常处理的类

异常种类如下:

在python中,不同的异常可以用不同的类型(python中统一了类与类型,类型即类)去标识,不同的类对象标识不同的异常,一个异常标识一种错误

AttributeError 试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x

IOError 输入/输出异常;基本上是无法打开文件

ImportError 无法引入模块或包;基本上是路径问题或名称错误

IndentationError 语法错误(的子类) ;代码没有正确对齐

IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]

KeyError 试图访问字典里不存在的键

KeyboardInterrupt Ctrl+C被按下

NameError 使用一个还未被赋予对象的变量

SyntaxError Python代码非法,代码不能编译。这是语法错误,写错了

TypeError 传入对象类型与要求的不符合

UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它

ValueError 传入一个调用者不期望的值,即使值的类型是正确的

为了保证程序的健壮性与容错性,即在遇到错误时程序不会崩溃,我们需要对异常进行处理

当python解释器检测到错误,触发异常,也可以由程序员自己触发异常,如:raise(编写程序特定的代码,专门用来捕捉这个异常)z

一旦捕捉成功则进入另外的处理流程,执行你为其定制的逻辑,从而使程序不会崩溃

转载注明来自www.linuxea.com中https://www.linuxea.com/1775.html

示例:

1,错误发生的条件是可预知的,我们需要用if进行处理:在错误发生之前进行预防

AGE=10

while True:

age=input('>>: ').strip()

if age.isdigit(): #只有在age为字符串形式的整数时,下列代码才不会出错,该条件是可预知的

age=int(age)

if age == AGE:

print('输入正确')

break

2,多条件

满足预知的多个条件,抛出提示,其他预知之外的else抛出一个异常-

AGE=10

while True:

age=input('>>:')

if age.isdigit():

age=int(age)

if age == AGE:

print('你输入10,输入正常')

break

elif age.isspace():

print('请输入数字,你输入的是空格')

elif len(age) == 0:

print('请输入数字,你输入的为空')

else:

print('其他非法输入')

3,例

def BBB():

print('test bbb')

choice_dic={

'1':BBB

}

while True:

choice=input('>>:').strip()

if not choice or choice not in choice_dic:

continue # 这便是异常处理

choice_dic[choice]()

如果输入1则打印test bbb,如果不是则continue,这句也算是异常处理

if not choice or choice not in choice_dic:

continue

在以上的3个例的if判断中,异常处理只能针对某一段代码,对于不同的代码段的相同类型错误需要写重复的if来进行处理

这些代码片段其实和程序本身无关,只存在与异常处理有关,尽管if是可以处理异常,但是可读性极差

II. 二,try except

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

如果错误发生的条件是不可预知的,则需要用到try...except:在错误发生之后进行处理

当然,我们应该尽量少使用try except,代码本身的逻辑问题应该尽量修正

基本语法:

try:

被检测的代码块

except 异常类型:

try中一旦检测到异常,就执行这个位置的逻辑

异常类只能用来处理指定的异常情况,如果非指定则无法处理

示例1

AGE=10

while True:

try:

age=input('Input Age >>:')

age=int(age)

if age == AGE:

print('你输入10,输入正常')

break

except ValueError as e:

print(e)

将输入非int类型捕捉,ValueError并且被打印

示例2:

try:

age=input('Input Age >>:')

age=int(age)

print(age)

name=input('Input Name >>:')

name=str(name)

print(name)

except ValueError as e:

print(e)

此时如果示例2中的age出错则终止,不会运行name

III. 三,except多分支

可以有多个except

如果被捕捉到则执行对应的内容,如果没有捕捉到程序则会崩溃!这样一来,就意味着要写很多except来区分异常。当然,我们需要分场景来看

大致是这样的:

try:

age=input('Input Age >>:')

int(age)

name = input('Input Name NUM >>:')

int(name)

dic={}

dic['mark']

a=[]

a[100000000]

except KeyError as e:

print('-K-',e)

except ValueError as e:

print('-V->',e)

except TypeError as e:

print('-T-',e)

except IndexError as e:

print('-I-',e)

IV. 四,except Exception多用途异常捕捉

Exception可以捕捉示例中任何异常,在其他中捕捉出现的所有异常

假设,我们只想通过一段代码逻辑来处理,无论出现什么异常,统一。那么一个Exception也足够

假如,你需要的是对于不同的异常定制不同的处理逻辑,那么就需要多分支了,如本章第三步骤(except多分支),多个except来完成,同时也可以在分支后面加上一个Exception,总之灵活使用

一个Exception处理异常:

while True:

try:

age=input('Input Age >>:')

int(age)

name = input('Input Name NUM >>:')

int(name)

dic={}

dic['mark']

a=[]

a[100000000]

except Exception as e:

print('请重新输入,输入有误',e)

break

多个分支与一个Exception:

try:

age=input('Input Age >>:')

int(age)

name = input('Input Name NUM >>:')

int(name)

dic={}

dic['mark']

a=[]

a[100000000]

except KeyError as e:

print('-K-',e)

except ValueError as e:

print('-V->',e)

except TypeError as e:

print('-T-',e)

except IndexError as e:

print('-I-',e)

except Exception as e:

print('请重新输入,输入有误',e)

V. 五,异常的其他结构

1,有异常则执行异常处理

2,当一段代码没有异常做出处理

3,无论是否有异常都做出处理

在以上三个前提中,如果有异常处理,执行异常处理和finally。如果没有异常则执行else和finally。它并不绝对

示例如下:

bbb='linuxea.com'

# bbb=123

try:

int(bbb)

except IndexError as e:

print(e)

except KeyError as e:

print(e)

except ValueError as e:

print(e)

else:

print('try内部代码没有异常则执行本条内容')

finally:

print('无论异常与否,都会执行该模块,通常进行清理工作')

VI. 六,主动触发异常raise

除了日常中常见的异常还可以raise主动触发一个异常,仍然可以被捕捉到

示例如下:

try:

raise TypeError('输入类型错误')

except Exception as e:

print(e)

VII. 七,自定义异常

自定义的异常需要继承一个类BaseException,定义一个类LinuxeaBlog继承BaseException

LinuxeaBlog(BaseException)

示例如下:

__author__="Linuxea"

class LinuxeaBlog(BaseException):

def __init__(self,msg):

self.msg=msg

try:

raise LinuxeaBlog('自己定制的类型错误')

except LinuxeaBlog as e:

print(e)

直接print

print(LinuxeaBlog('自己定制的类型错误'))

VIII. 八,断言assert

在程序的某个位置,判断是否是自己想要的值,如果不是则会抛出异常,可以用assert也可以用if判断

示例:

def linuxea1():

# print('逻辑1')

res=1

return res

def linuxea2():

# print('逻辑2')

res=2

return res

a1=linuxea1()

a2=linuxea2()

assert a1 == 1

print('a1等于1')

linuxea1和linuxea2,在最后assert断言a1等于1。如果assert断言a1等于1条件成立,则执行print('a1等于1'),否则则报错

其实可以使用其他方式,如if:

if a1 !=1:

raise AssertionError

相比较assert a1 == 1,和if的使用,assert断言是非常简单明了的

IX. 九,try except与if判断

在try except和if中都可以被用到,都可以使用。

try和except

try:

'code'

except TypeError: 其他异常1

'其他逻辑1'

except keyError: 其他异常2

'其他逻辑2'

except Exception: 其他没有考虑到的异常

'其他逻辑3'

单单if

if '条件':

'code'

elif '其他条件1':

'其他逻辑1'

elif '其他条件2':

'其他逻辑2'

else: 其他没有考虑到的条件

'其他逻辑3'

除非另有说明,否则本站上的内容根据以下许可进行许可: CC署名-非商业性使用-相同方式共享4.0国际许可协议4.0进行许可

本文作者:www.linuxea.com for Mark

文章链接:http://www.linuxea.com/1775.html (转载请注明本文出处和本章链接)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值