请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

python基础(21):异常处理

[复制链接]
查看: 107|回复: 0

1万

主题

2万

帖子

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
46413
发表于 2019-11-9 15:51 | 显示全部楼层 |阅读模式
1. 很是和毛病

1.1 毛病

步伐中难免出现毛病,而毛病分红两种
1.1.1 语法毛病

语法毛病:这类毛病,底子过不了python表白器的语法检测,必须在步伐实行前就更正。
  1. #语法毛病树模一if#语法毛病树模二def test:    pass#语法毛病树模三print(haha
复制代码
1.1.2 逻辑毛病
  1. #用户输入不完整(比如输入为空)大要输入不法(输入不是数字)num=input(">>: ")int(num)#没法完成盘算res1=1/0res2=1+'str'
复制代码
1.2 什么是很是

很是就是步伐运转时发生毛病的信号,在python中,毛病触发的很是以下:
python基础(21):异常处理  游戏 1823516-20191109105627115-1215446929

1.3 很是品种

在python中差别的很是可以用差别的典范(python中同一了类与典范,典范即类)去标识,差别的类工具标识差别的很是,一个很是标识一种毛病。
1.3.1 很是例子

1.触发IndexError:
  1. l=['egon','aa']l[3]
复制代码
2.触发KeyError
  1. dic={'name':'egon'}dic['age']
复制代码
3.触发ValueError
  1. s='hello'int(s)
复制代码
1.3.2 常用很是
  1. AttributeError 试图拜候一个工具没有的树形,比如foo.x,可是foo没有属性xIOError 输入/输出很是;底子上是没法翻开文件ImportError 没法引入模块或包;底子上是途径题目或称号毛病IndentationError 语法毛病(的子类);代码没有正确对齐IndexError 下标索引超越序列界限,比如当x只要三个元素,却试图拜候x[5]KeyError 试图拜候字典里不存在的键KeyboardInterrupt Ctrl+C被按下NameError 操纵一个还未被赋予工具的变量SyntaxError Python代码不法,代码不能编译(小我以为这是语法毛病,写错了)TypeError 传入工具典范与要求的不合适UnboundLocalError 试图拜候一个还未被设备的部分变量,底子上是由于另有一个同名的全局变量,致使你以为正在拜候它ValueError 传入一个挪用者不盼望的值,即使值的典范是正确的
复制代码
1.3.3 更多很是
  1. ArithmeticErrorAssertionErrorAttributeErrorBaseExceptionBufferErrorBytesWarningDeprecationWarningEnvironmentErrorEOFErrorExceptionFloatingPointErrorFutureWarningGeneratorExitImportErrorImportWarningIndentationErrorIndexErrorIOErrorKeyboardInterruptKeyErrorLookupErrorMemoryErrorNameErrorNotImplementedErrorOSErrorOverflowErrorPendingDeprecationWarningReferenceErrorRuntimeErrorRuntimeWarningStandardErrorStopIterationSyntaxErrorSyntaxWarningSystemErrorSystemExitTabErrorTypeErrorUnboundLocalErrorUnicodeDecodeErrorUnicodeEncodeErrorUnicodeErrorUnicodeTranslateErrorUnicodeWarningUserWarningValueErrorWarningZeroDivisionError
复制代码
2. 很是处置惩罚

很是发生以后,很是以后的代码就不会实行了,假如想要代码一般运转,就要举行很是处置惩罚了。
2.1 什么是很是处置惩罚

python表白器检测到毛病,触发很是(也答应步伐员自己触发很是)。
步伐员编写特定的代码,专门用来捕捉这个很是(这段代码与步伐逻辑无关,与很是处置惩罚有关)。
假如捕捉乐成则进入此外一个处置惩罚分支,实行你为其定制的逻辑,使步伐不会崩溃,这就是很是处置惩罚。
2.2 为什么要举行很是处置惩罚

python分解器去实行步伐,检测到了一个毛病时,触发很是,很是触发后且没被处置惩罚的情况下,步伐就在当前很是处制止,背面的代码不会运转,谁会去用一个运转着忽然就崩溃的软件。
所以你必须供给一种很是处置惩罚机制来增强你步伐的结实性与容错性。
2.3 怎样举行很是处置惩罚

首先须知,很是是由步伐的毛病引发的,语法上的毛病跟很是处置惩罚无关,必须在步伐运转前就批改。
python为每一种很是致使了一个典范,然后供给了一种特定的语法结构来举行很是处置惩罚。
2.3.1 底子语法

格式:
  1. try:     被检测的代码块except 很是典范:     try中一旦检测到很是,就实行这个位置的逻辑
复制代码
案例:
  1. try:    f = open('a.txt')    g = (line.strip() for line in f)    print(next(g))    print(next(g))    print(next(g))    print(next(g))    print(next(g))except StopIteration:    f.close()'''next(g)会触发迭代f,依次next(g)便可以读取文件的一行行内容,不管文件a.txt有多大,同一时辰内存中只要一行内容。提醒:g是基于文件句柄f而存在的,因此只能在next(g)抛出很是StopIteration后才可以实行f.close()'''
复制代码
很是类智能用来处置惩罚指定的很是情况,假如非指定很是则没法处置惩罚。
  1. # 未捕捉到很是,步伐间接报错s1 = 'hello'try:    int(s1)except IndexError as e:    print e
复制代码
2.3.2 多分支

格式:
  1. try:     被检测的代码块except 很是典范:     try中一旦检测到很是,就实行这个位置的逻辑except 很是典范:     try中一旦检测到很是,就实行这个位置的逻辑    ...except 很是典范:     try中一旦检测到很是,就实行这个位置的逻辑
复制代码
从上向下报错的代码只要找到一个和报错典范合适的分支就实行这个分支中的代码,然后间接退出分支。假如找不到能处置惩罚和报错典范类似的分支,会不停往下走,末端照旧没有找到就会报错。
案例:
  1. s1 = 'hello'try:    int(s1)except IndexError as e:    print(e)except KeyError as e:    print(e)except ValueError as e:    print(e)
复制代码
2.3.3 万能很是

在python的很是中,有一个万能很是:Exception,他可以捕捉尽情很是,即:
  1. s1 = 'hello'try:    int(s1)except Exception as e:    print(e)
复制代码
你大要会说既然有万能很是,那末我间接用上面的这类形式就行了,其他很是可以疏忽。
你说的没错,可是应当分两种情况去看:
1.假如你想要的成果是,不管出现什么很是,我们同一抛弃,大要操纵同一段代码逻辑去处理他们,那末只要一个Exception就充沛了。
  1. s1 = 'hello'try:    int(s1)except Exception,e:    '抛弃大要实行其他逻辑'    print(e)#假如你同一用Exception,没错,是可以捕捉全数很是,但意味着你在处置惩罚全数很是时都操纵同一个逻辑去处理(这里说的逻辑即当前expect下面跟的代码块)
复制代码
2.假如你想要的成果是,对于差别的很是我们需要定制差别的处置惩罚逻辑,那就需要用到多分支了。
  1. s1 = 'hello'try:    int(s1)except IndexError as e:    print(e)except KeyError as e:    print(e)except ValueError as e:    print(e)except Exception as e:    print(e)
复制代码
2.3.4 很是的其他结构

格式:
  1. try:     被检测的代码块except 很是典范:     try中一旦检测到很是,就实行这个位置的逻辑    ...except 很是典范:     try中一旦检测到很是,就实行这个位置的逻辑else:    try内代码块没有很是则实行finally:    不管很是与否,城市实行该模块,凡是是举行清算工作
复制代码
案例:
  1. s1 = 'hello'try:    int(s1)except IndexError as e:    print(e)except KeyError as e:    print(e)except ValueError as e:    print(e)#except Exception as e:#    print(e)else:    print('try内代码块没有很是则实行我')finally:    print('不管很是与否,城市实行该模块,凡是是举行清算工作')
复制代码
2.3.5 自动触发很是
  1. try:    raise TypeError('典范毛病')except Exception as e:    print(e)
复制代码
2.3.6 自界说很是
  1. class EvaException(BaseException):    def __init__(self,msg):        self.msg=msg    def __str__(self):        return self.msgtry:    raise EvaException('典范毛病')except EvaException as e:    print(e)
复制代码
2.4 什么时候操纵很是处置惩罚

有的同学会这么想,学完了很是处置惩罚后,好强大,我要为我的每一段步伐都加上try...except,干毛线去思考它会不会有逻辑毛病啊,这样就很好啊。
try...except应当尽管少用,由于它自己就是你附加给你的步伐的一种很是处置惩罚的逻辑,与你的垂危的工作是没有关系的。
这类工具加的多了,会致使你的代码可读性变差,只要在有些很是没法预知的情况下,才应当加上try...except,其他的逻辑毛病应当尽管批改。
很是的继续关系:
  1. BaseException +-- SystemExit +-- KeyboardInterrupt +-- GeneratorExit +-- Exception      +-- StopIteration      +-- StandardError      |    +-- BufferError      |    +-- ArithmeticError      |    |    +-- FloatingPointError      |    |    +-- OverflowError      |    |    +-- ZeroDivisionError      |    +-- AssertionError      |    +-- AttributeError      |    +-- EnvironmentError      |    |    +-- IOError      |    |    +-- OSError      |    |         +-- WindowsError (Windows)      |    |         +-- VMSError (VMS)      |    +-- EOFError      |    +-- ImportError      |    +-- LookupError      |    |    +-- IndexError      |    |    +-- KeyError      |    +-- MemoryError      |    +-- NameError      |    |    +-- UnboundLocalError      |    +-- ReferenceError      |    +-- RuntimeError      |    |    +-- NotImplementedError      |    +-- SyntaxError      |    |    +-- IndentationError      |    |         +-- TabError      |    +-- SystemError      |    +-- TypeError      |    +-- ValueError      |         +-- UnicodeError      |              +-- UnicodeDecodeError      |              +-- UnicodeEncodeError      |              +-- UnicodeTranslateError      +-- Warning           +-- DeprecationWarning           +-- PendingDeprecationWarning           +-- RuntimeWarning           +-- SyntaxWarning           +-- UserWarning           +-- FutureWarning       +-- ImportWarning       +-- UnicodeWarning       +-- BytesWarning
复制代码
免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 妈妈网-中国妈妈第一,是怀孕、育儿、健康等知识交流传播首选平台 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表