程序的使用者往往会因为错误的输入导致程序崩溃,比如:
程序需要打开一个文件,使用者输入一个不存在的文件名;使用列表时,输入的索引超出列表的范围;使用字典时,输入了一个错误的key...
python中我们使用异常处理来解决这一问题。
比如:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 filename = 'abcd.txt' #此文件不存在 2 list_1 = ['a', 'b', 'c', 'd'] 3 dict_1 = { 4 'name' : 'John', 5 'age' : 22, 6 'gender' : 'M' 7 } 8 9 try :10 '''这里写可能会出错的代码'''11 open(filename, 'r') #如果这里出错,try中的代码不再执行12 print(list_1[5])13 print(dict_1['haha'])14 print(x)15 16 # FileNotFoundError程序书写者提前预估到可能会出现这个错误,后面的下同理17 except FileNotFoundError as e:18 '''这里写应对FileNotFoundError的代码'''19 # 捕捉到FileNotFoundError,执行这里的代码20 print("打开文件错误, 这个文件不存在")21 print(e)22 except IndexError as e:23 print("列表操作错误,请检查index值")24 print(e)25 except KeyError as e:26 print("字典操作错误,请检查key值")27 print(e)28 # 可能会出现未预估到的错误,写在最后29 except:30 print("出现未知错误...")31 else:32 print("之前try下的那段代码没有出错,执行这里的代码...")33 finally:34 print("无论之前的代码是否出错,都执行这里的代码")35 36 37 >>>38 打开文件错误, 这个文件不存在39 [Errno 2] No such file or directory: 'abcd.txt'40 无论之前的代码是否出错,都执行这里的代码
我们常常使用这种格式来进行异常处理:
try: #可能出错的代码except Error as e: #应对代码....except: #出现不可预知错误,提示代码else: #无异常执行完后,应对代码finally: #最终代码
注意:else和finally为可选,如果用不到可以不写。
小技巧:异常类型可以通过故意写错某些代码来从pyhon解释器中获得,不必去记忆那些常见异常的总结。
自定义异常:
如果你是一个第三方库的编写者,那么难免需要自定义一些异常,以供库的使用者出现错误操作时获得提示信息,知道是由于那个地方错误导致程序崩溃。
当然我们自定义的异常也可以被try....except处理。
比如(自定义一个简单的异常并触发它):
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #自定义了一个名为TempError的异常 2 class TempError(Exception): 3 def __init__(self, msg): 4 self.message = msg 5 6 7 raise TempError("Passed a wrong parameter") 8 # try: 9 # #主动触发这个异常10 # raise TempError("Passed a wrong parameter")11 # #对这个异常进行处理12 # except TempError as e:13 # print(e)14 15 16 >>>17 Traceback (most recent call last):18 File "E:/文件/python学习/python学习代码/第六周/test_5.py", line 7, in19 raise TempError("Passed a wrong parameter")20 __main__.TempError: Passed a wrong parameter
在本例中,我们未做判断便主动触发了这个异常。当然在实际应用中,得首先做逻辑判断(比如传进一个错误的地址,导致数据库连不上),然后在触发这个异常,提示用户。
注意:在我们编写的库中,不应该做对自己定义的异常的处理,只需要根据情况触发它,提示给库的使用者即可。本例中的只是做一个示范而已。
我们使用这种格式来定义一个异常:
class TempError(Exception): def __init__(self, msg): self.message = msgraise TempError(这个异常的提示信息) #触发这个异常
用一个继承Exception的类来定义它,用raise触发。