zoukankan      html  css  js  c++  java
  • python --- 异常处理

      程序的使用者往往会因为错误的输入导致程序崩溃,比如:

        程序需要打开一个文件,使用者输入一个不存在的文件名;使用列表时,输入的索引超出列表的范围;使用字典时,输入了一个错误的key...

      python中我们使用异常处理来解决这一问题。

        比如:

     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 无论之前的代码是否出错,都执行这里的代码
    View Code

        我们常常使用这种格式来进行异常处理:       

    try:
        #可能出错的代码
    except Error as e:
        #应对代码
    ....
    except:
        #出现不可预知错误,提示代码
    else:
        #无异常执行完后,应对代码
    finally:
        #最终代码
    

        注意:else和finally为可选,如果用不到可以不写。

        小技巧:异常类型可以通过故意写错某些代码来从pyhon解释器中获得,不必去记忆那些常见异常的总结。

    自定义异常:

      如果你是一个第三方库的编写者,那么难免需要自定义一些异常,以供库的使用者出现错误操作时获得提示信息,知道是由于那个地方错误导致程序崩溃。

      当然我们自定义的异常也可以被try....except处理

      比如(自定义一个简单的异常并触发它):

     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, in <module>
    19     raise TempError("Passed a wrong parameter")
    20 __main__.TempError: Passed a wrong parameter
    View Code

      在本例中,我们未做判断便主动触发了这个异常。当然在实际应用中,得首先做逻辑判断(比如传进一个错误的地址,导致数据库连不上),然后在触发这个异常,提示用户。

      注意:在我们编写的库中,不应该做对自己定义的异常的处理,只需要根据情况触发它,提示给库的使用者即可。本例中的只是做一个示范而已。

      我们使用这种格式来定义一个异常:

    class TempError(Exception):
        def __init__(self, msg):
            self.message = msg
    
    
    raise TempError(这个异常的提示信息) #触发这个异常
    

          用一个继承Exception的类来定义它,用raise触发。

  • 相关阅读:
    gearman任务分发改进
    gearman实现任务分发
    BeanStalkd 做队列服务
    Tomcat各种日志的关系与catalina.out文件的分割
    数据库系统原理-关系数据库的规范化理论总结
    MySQL配置参数innodb_flush_log_at_trx_commit
    gRPC快速入门
    使用vagrant和kubeadm搭建k8s集群
    VS项目属性中的C/C++运行库:MT、MTd、MD、MDd
    消除C++中警告代码
  • 原文地址:https://www.cnblogs.com/God-Li/p/7589057.html
Copyright © 2011-2022 走看看