一般情况下,在Python无法正常处理程序时就会发生一个异常,弹出一大串英文提示。对于一般用户来说会无所适从,影响用户体验,严重的会导致程序崩溃。我们需要对异常捕获进行处理。 一、异常处理的语法:try:<语句> #要执行的代码except <名字1>:#捕获异常名<语句> #对捕获的异常进行处理except <名字2>:#如果对多个异常一并处理,用逗号分隔异常名<语句> else:<语句> #如果没有异常发生 例如: try: print('-'*20) #把符号打印20遍,python特有的语法功能,方便易用吧 n1=input('input first num:') n2=input('input second num:') print(int(n1)/int(n2)) print('-'*20)except ZeroDivisionError: print('除数不能为0!')except ValueError: print('只能输入数字!') 运行结果: --------------------input first num:7input second num:0除数不能为0!>>> --------------------input first num:ainput second num:5只能输入数字! 二、捕获异常的描述信息把描述信息用as 保存到变量中,这样就看到系统提示的英文异常了。如下例: try: print('-'*20) n1=input('input first num:') n2=input('input second num:') print(int(n1)/int(n2)) print('-'*20)except (ZeroDivisionError, ValueError) as desc: print('捕捉到异常:%s' %desc) 结果: --------------------input first num:5input second num:0捕捉到异常:division by zero 三、捕获所有的异常异常会有很多,常常防不胜防。这时,我们可以不指明异常类型,让它可以处理任何异常。 except : print('出错了')也可以把具体的异常信息打印出来。except Exception as desc: print('捕捉到异常:%s' %desc) 四、异常后处理发生异常后,有些事情必须要进行处理,比如变量释放,锁释放,文件关闭等等,否则系统会崩溃。这些要处理的代码要放在try....except...finally语句的finally区。如下例: finally: f.close() print('释放资源') 注意: try....except...else...finally,顺序不能反,else和finally可选,else语句的存在以except存在为前提。 五、主动抛出异常raise显式地触发异常,如下例: try: raise IndexErrorexcept IndexError: print('索引越界')except: print('出错了') 结果: 索引越界 附:常见异常 1. NameError 访问一个未申明的变量,会引发NameError异常。 2. ZeroDivisionError 被0除,会引发ZeroDivisionError异常。 3. SystaxError 语法错误,会引发SystaxError异常。 4. IndexError 访问序列中不存在的索引时,会引发IndexError异常。 5. KeyError 访问dictionary中不存在的键时,会引发KeyError异常。 6. FileNotFoundError 访问不存在的文件,会引发FileNotFoundError异常。 7. AttributeError 访问不存在的对象属性时,会引发AttributeError异常。 六、assert断言断言指期望用户满足指定的条件,当不满足用户定义的约束条件时,它会触发AssertionError异常。可以看作是条件式的raise语句。格式如下: Assert 逻辑表达式,data #data是可选的 等同于: If not 逻辑表达式: raise AssertionError(data) 如下例: a=0assert a != 0,'a值不能为0!' 结果: Traceback (most recent call last): File 'D:/pyTest/test.py', line 2, in <module> assert a != 0,'a值不能为0!'AssertionError: a值不能为0! 七、自定义异常先定义一个继承Exception类的子类,再用raise调用这个异常类。如下例: class ShortInputException(Exception): #定义一个异常类 def __init__(self, pw): self.pw = pwtry: text=input('请输入密码:') if len(text) < 6: raise ShortInputException(text)except ShortInputException: print('密码长度不能小于6位!')except Exception as desc: print('出错了:%s' %desc) 运行结果: 请输入密码:1234密码长度不能小于6位! 八、预定义清理Finally可以关闭文件,清理资源。除了finally手动释放资源外,还可以用with语句预定义清理操作,即无论资源在使用过程中是否发生异常,都会执行清理的操作,比如文件使用后自动关闭。 With 上下文表达式 [as 资源对象]: 对象的操作 上下文表达式:返回一个上下文管理器对象。若指定了as子句,该对象并不赋值给资源对象,而是将上下文管理器的__enter__()方法的返回值赋值给资源对象。 资源对象:可以是单个变量,也可以是元组。 对象的操作:with语句包裹的代码块。在执行该代码块之前,会调用上下文管理器的__enter__()方法;在执行该代码块之后,会执行__exit__()方法。 如下例: with open(“/tmp/abc.txt”) as file: data=file.read() 使用with语句打开文件,如果能打开则将文件对象赋值给file,然后执行with语句的代码块,读文件。代码块执行完毕后,with语句会关闭文件。即使代码块运行过程中产生了异常,with语句也会关闭文件。 |
|
来自: 星光闪亮图书馆 > 《Python学习》