python之异常处理
1.异常处理
1.1错误
程序中难免出现错误,错误分成两种:
(1.)语法错误
#语法错误示范一 if #语法错误示范二 def test: pass #语法错误示范三 class Foo pass #语法错误示范四 print(haha 语法错误示范
(2.)逻辑错误
#用户输入不完整(比如输入为空)或者输入非法(输入不是数字) num=input(">>: ") int(num)
什么是异常
异常就是程序运行时发生错误的信号,在python中,错误触发的异常如下:
异常种类
在python中不同的异常可以用不同的类型去标识,不同的类对象标识不同的异常,一个异常标识一种错误
1.2异常处理
什么是异常处理
Python解释器检测大错误,触发异常
程序员编写特定的代码,专门用来捕捉这个异常
如果捕捉成功则进入另外一个处理分支,执行你为其定制的逻辑,使程序不会崩溃,这就是异常处理
如何进行异常处理
异常是由程序的错误引起的,语法上的错误跟异常处理无关,必须在程序运行前就修正
(1) 使用if判断式
num1=input('>>: ') #输入一个字符串试试 if num1.isdigit(): int(num1) #我们的正统程序放到了这里,其余的都属于异常处理范畴 elif num1.isspace(): print('输入的是空格,就执行我这里的逻辑') elif len(num1) == 0: print('输入的是空,就执行我这里的逻辑') else: print('其他情情况,执行我这里的逻辑')
总结:
If判断式的异常处理只能针对某一段代码,对于不同的代码段 的相同类型的错误需要写重复的if来进行处理。
程序中频繁的写与程序本身无关,与异常处理有关的if,可读性极其的差
(2) python为每一种异常定制了一个类型,然后提供了一种特定的语法结构用来进行异常处理
基本语法:
try: 被检测的代码块 except 异常类型: try 中一旦检测到异常,就执行这个位置的逻辑
异常类只能用来处理指定的异常情况,如果非指定异常则无法处理
try: print("=========") print(x) print("=========") except NameError: #捕捉异常 pass print("继续其他的事情")#程序继续执行 >> ========= 继续其他的事情 try: print("=========") print(x) print("=========") except NameError as a: #将报错类型赋值给变量a print(a) 打印变量 print("继续其他的事情") #程序继续执行 >> ========= name 'x' is not defined 继续其他的事情
万能异常 在python的异常中,有个万能异常Exception,可以捕获仁和异常
s1="hello" try: int(s1) except TypeError as a:#多分支 print(a) except NameError as a:#多分支 print(a) except Exception as a: print(a) else: print("try内代码没有异常则执行我") finally: print("无论异常以否,都会执行该模块,通常是进行清理工作") >> invalid literal for int() with base 10: 'hello' 无论异常以否,都会执行该模块,通常是进行清理工作
异常的其他机构
s1="hello" try: int(s1) except IndexError as e: print(e) except ValueError as e: print(e) except KeyError as e: print(e) else: print("try内代码没有异常则执行我") finally: print("无论异常以否,都会执行该模块,通常是进行清理工作")
主动触发异常
try: raise TypeError("类型错误") except Exception as e: print(e)
自定义异常
class EgonException(BaseException): def __init__(self,msg): self.msg=msg def __str__(self): return self.msg try: raise EgonException("类型错误") except EgonException as e: print(e)
断言
assert 1==1
try…except 和if 的比较
try…except这种异常处理机制就是取代if那种方式,让程序在不牺牲可读性的前提下增强健壮性和容错性异常处理中为每一个异常定制了异常类型(Python中统一了类与类型,类型即是类),对于同一种异常,一个except就可以捕捉到,可以同时处理多段代码的异常(无需写多个if判断式),减少了代码,增强了可读性
什么时候用异常处理
只有在有些异常无法预知的情况下,才应该加上try…except