博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python3-异常处理
阅读量:6800 次
发布时间:2019-06-26

本文共 3758 字,大约阅读时间需要 12 分钟。

一 什么是异常

异常就是程序运行时发生错误的信号(在程序出现错误时,会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止)。

在python中,错误触发的异常如下

而错误分成两种

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

#语法错误示范一if#语法错误示范二def test:    pass#语法错误示范三class Foo    pass#语法错误示范四print(haha)

2.逻辑错误

#TypeError:int类型不可迭代for i in 3:    pass#ValueErrornum=input(">>: ") #输入helloint(num)#NameErroraaa#IndexErrorl=['egon','aa']l[3]#KeyErrordic={
'name':'egon'}dic['age']#AttributeErrorclass Foo:passFoo.x#ZeroDivisionError:无法完成计算res1=1/0res2=1+'str'

二 异常的种类

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

常见异常

AttributeError    试图访问一个对象没有树形,比如foo.x , 但是foo没有属性xIOError    输入/输出异常;基本上是无法打开文件ImportError    无法引入模块或包;基本上是路径问题或名称错误IndentationError    语法错误(的子类);代码没有正确对其  例如缩进IndexError    下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]KeyError    试图访问字典里不存在的键KeyboardInterrupt    Ctrl + C被按下NameError    使用一个还未被复制对象的变量SyntaxError    语法错误TypeError    传入对象类型与要求的不符合UnboundLocalError    试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量ValueError    传入一个调用者不期望的值,即使值的类型是正确的
ArithmeticErrorAssertionErrorAttributeErrorBaseExceptionBufferErrorBytesWarningDeprecationWarningEnvironmentErrorEOFErrorExceptionFloatingPointErrorFutureWarningGeneratorExitImportErrorImportWarningIndentationErrorIndexErrorIOErrorKeyboardInterruptKeyErrorLookupErrorMemoryErrorNameErrorNotImplementedErrorOSErrorOverflowErrorPendingDeprecationWarningReferenceErrorRuntimeErrorRuntimeWarningStandardErrorStopIterationSyntaxErrorSyntaxWarningSystemErrorSystemExitTabErrorTypeErrorUnboundLocalErrorUnicodeDecodeErrorUnicodeEncodeErrorUnicodeErrorUnicodeTranslateErrorUnicodeWarningUserWarningValueErrorWarningZeroDivisionError

 

三 异常处理

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

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

AGE=10while True:    age=input('>>: ').strip()    if age.isdigit(): #只有在age为字符串形式的整数时,下列代码才不会出错,该条件是可预知的        age=int(age)        if age == AGE:            print('you got it')            break

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

#基本语法为try:    被检测的代码块except 异常类型:    try中一旦检测到异常,就执行这个位置的逻辑#举例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()

 

四 try..except...详细用法

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

s1 = 'hello'try:    int(s1)except IndexError as e: # 未捕获到异常,程序直接报错    print e

2.多分支

s1 = 'hello'try:    int(s1)except IndexError as e:    print(e)except KeyError as e:    print(e)except ValueError as e:    print(e)

3.万能异常Exception

s1 = 'hello'try:    int(s1)except Exception as e:    print(e)

4.也可以在多分支后来一个Exception

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)

5.异常的其他结构

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('无论异常与否,都会执行该模块,通常是进行清理工作')

6.主动触发异常

try:    raise TypeError('类型错误')except Exception as e:    print(e)

7.自定义异常

class EgonException(BaseException):    def __init__(self,msg):        self.msg=msg    def __str__(self):        return self.msgtry:    raise EgonException('类型错误')except EgonException as e:    print(e)

8.断言:assert 条件

v1 = 1v2 = 2 assert (v1 < v2)# assert (v1 > v2)assert (v1 > v2),'{0} is not bigger than {1}'.format(v1,v2)

以上代码抛出异常

Traceback (most recent call last):  File "xxx", line 8, in 
assert (v1 > v2),'{0} is not bigger than {1}'.format(v1,v2)AssertionError: 1 is not bigger than 2

 

断言跟异常的区别:

断言是用来检查非法情况而不是错误情况的,用来帮开发者快速定位问题的位置。

异常处理用于对程序发生异常情况的处理,增强程序的健壮性和容错性。

对一个函数而言,一般情况下,断言用于检查函数输入的合法性,要求输入满足一定的条件才能继续执行;

在函数执行过程中出现的异常情况使用异常来捕获。

 

转载于:https://www.cnblogs.com/Xuuuuuu/p/10275739.html

你可能感兴趣的文章
深入浅出学习Hibernate框架(一):从实例入手初识Hibernate框架
查看>>
JDBC的基本用法
查看>>
Android开发之TextView排版问题
查看>>
9.0 alpha 版安装出现 could not execute command lessc 的问题
查看>>
SIP入门(二):建立SIPserver
查看>>
html里的table如何在表格内部保留表格横线的同时去掉表格里的竖线
查看>>
老板必备:核心员工跳槽时,必聊的8个话题(转)
查看>>
TNS-00512: Address already in use-TNS-12542: TNS:address already in use
查看>>
什么是快速排序(转)
查看>>
会议论文重新投稿算不算侵权?这肯定是所多人都遇到过的问题。
查看>>
js判断checkbox状态,处理表单提交事件
查看>>
工程师,请优化你的代码
查看>>
BZOJ3495 : PA2010 Riddle
查看>>
探访莱布尼茨:与大师穿越时空的碰撞
查看>>
Hibernate SQL优化技巧dynamic-insert="true" dynamic-update="true"
查看>>
如何削减高速语言?
查看>>
山寨游戏的未来Apple App Store
查看>>
JSON.parse()和JSON.stringify()
查看>>
python出现UnicodeEncodeError有可能产生的另一个原因
查看>>
域名绑定,解析总结
查看>>