zoukankan      html  css  js  c++  java
  • python基础-异常(exception)处理

                        python基础-异常(exception)处理

                                       作者:尹正杰

    版权声明:原创作品,谢绝转载!否则将追究法律责任。

      

      

      程序中难免出现错误,而错误分成两种,即语法错误和逻辑错误。语法错误根本过不了python解释器的语法检测,必须在程序执行前就改正,还有一种就是逻辑错误,对逻辑错误的处理是本篇博客介绍的重点。

    一.什么是异常

      1>.python解释器检测到错误,触发异常(也允许程序员自己触发异常);

      2>.程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关);

      3>.如果捕捉成功则进入另外一个处理分支,执行你为其定制的逻辑,使程序不会崩溃,这就是异常处理;

    二.为什么要处理异常

       python解析器去执行程序,检测到了一个错误时,触发异常,异常触发后且没被处理的情况下,程序就在当前异常处终止,后面的代码不会运行,谁会去用一个运行着突然就崩溃的软件。所以你必须提供一种异常处理机制来增强你程序的健壮性与容错性 .

    三.如何进行异常处理

      首先须知,异常是由程序的错误引起的,语法上的错误跟异常处理无关,必须在程序运行前就修正.

    1>.常见的异常

     1 #以下是常见的逻辑异常,注意,语法错误不算是逻辑异常哟!
     2 #1>. NameError,即变量错误,没有定义就被调用了,案例展示如下:
     3 # a
     4 #2>. TypeError,即类型错误,传入的数据类型应该是一个迭代器,案例展示如下:
     5 # sum(1,2,3)
     6 #3>.KeyError,上面定义的字典是空的,但是你还得去取值,当然啥也取不出来啦!不得不抛出异常,案例展示如下:
     7 # dic = {}
     8 # dic["key"]
     9 #4>.IndexError,索引错误,在列表中不存在对应的下标就会爆出异常,案例展示如下:
    10 # array = []
    11 # array[1]
    12 #5>.StopIteration,迭代器的对象遍历完毕之后会跑出的异常,案例展示如下:
    13 # array = [1,2]
    14 # array_iterator = iter(array)
    15 # next(array_iterator)
    16 # next(array_iterator)
    17 # next(array_iterator)
    18 #6>.ValueError:,即传值错误,要求你传入数字,结果你传入的是字母,案例展示如下:
    19 # number = input("num:")
    20 # int(number)

    2>.单分支异常处理

     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 #@author :yinzhengjie
     4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
     5 #EMAIL:y1053419035@qq.com
     6 
     7 try:
     8     number = input("Your number:>>>").strip()
     9     number = int(number)
    10     print("您输入的数字是:%d" % number)
    11 except ValueError:
    12     print("请输入一个整数!")
    13 '''
    14     放在try中的代码如果遇到except中的错误类型,就会执行except的代码且一旦发生异常,try中的代码会停止在异常处,
    15 但不影响try语句之外的代码执行。一种错误类型只能处理对应的一种错误,其它错误还照样报错。
    16 '''

    3>.多分支异常处理

     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 #@author :yinzhengjie
     4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
     5 #EMAIL:y1053419035@qq.com
     6 
     7 try:
     8     number = input("Your number:>>>").strip()
     9     number = int(number)
    10     print("您输入的数字是:%d" % number)
    11     a
    12     sum(1,2,3)
    13 except ValueError:
    14     print("请输入一个整数!")
    15 except NameError as name_error:
    16     print("产生了一个%s"%name_error)
    17 except TypeError:
    18     print("咋又诞生了一个错误呢!")

    4>.万能异常处理

     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 #@author :yinzhengjie
     4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
     5 #EMAIL:y1053419035@qq.com
     6 
     7 try:
     8     number = input("Your number:>>>").strip()
     9     number = int(number)
    10     print("您输入的数字是:%d" % number)
    11     a
    12     sum(1,2,3)
    13 except Exception as  err:
    14     print("你的程序异常啦!%s"%err)
    15 
    16 """
    17     对于你已经可以遇见的但是不能完全规避的必须要处理的异常,你应该去制定他的处理方式,对于其它你不能预料的,在使用万能异常处理。
    18 """

    5>.异常处理的else语句

     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 #@author :yinzhengjie
     4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
     5 #EMAIL:y1053419035@qq.com
     6 
     7 try:
     8     a = 1
     9 except NameError as err:
    10     print(err)
    11 else:
    12     print("当try语句中不会发生异常的时候执行else中的代码啦!")

    6>.异常处理之finally语句

     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 #@author :yinzhengjie
     4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
     5 #EMAIL:y1053419035@qq.com
     6 
     7 
     8 def func():
     9     try:
    10         f = open('yinzhengjie.java')
    11         int(f.read())
    12         print("*********开始关闭文件啦!")      #代码并不会被执行
    13         f.close()
    14         print("文件已经被关闭啦**********")
    15     except ValueError as err:
    16         return  -1
    17     else:
    18         print("以上代码没有异常")           #try代码块中没有异常的时候才会被执行,finally代码块中代码永远执行。
    19     finally:
    20         print("开始关闭文件啦!")
    21         f.close()
    22         print("文件已经被关闭啦")
    23 
    24 '''
    25 finally关键字:
    26     不管程序遇到何种的异常,或是中途return啦,最终finally的代码都会被执行哟!一般用于清理工作,即把之前打开的链接,
    27 文件等资源都关掉,避免因为程序异常造成的浪费资源和逻辑问题。
    28 '''
    29 
    30 print(func())

    7>.主动触发异常

     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 #@author :yinzhengjie
     4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
     5 #EMAIL:y1053419035@qq.com
     6 
     7 try:
     8     raise ValueError        #主动触发异常!
     9 except ValueError:
    10     print("Error")

    8>.断言

     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 #@author :yinzhengjie
     4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
     5 #EMAIL:y1053419035@qq.com
     6 
     7 
     8 
     9 assert 1 == 1
    10 
    11 print("正确执行")
    12 
    13 assert 1 == 2     #一言不合就报错!只要这个条件不满足就抛出异常!断言一般用于在一个功能的最开始
    14 
    15 print("错误执行")

    四.什么时候用异常处理

      其实异常处理我是不建议大家用它的,try....except语句应该尽量少用,因为他本身就是你附加给程序的一个异常处理的逻辑,与你的主要的工作是没有关系的,这种东西加的多了,会导致你的代码可读性变差,只有在有些异常无法预知的情况下,才应该加上try...except,其它的逻辑错误应该尽量修正。

     

    转载于:https://www.cnblogs.com/yinzhengjie/p/8727011.html

  • 相关阅读:
    Java实现 蓝桥杯 算法训练 Number Challenge(暴力)
    Java实现 蓝桥杯 算法训练 Number Challenge(暴力)
    Java实现 蓝桥杯 算法训练 Number Challenge(暴力)
    Java实现 蓝桥杯 算法训练 Rotatable Number(暴力)
    Java实现 蓝桥杯 算法训练 Rotatable Number(暴力)
    Java实现 蓝桥杯 算法训练 Rotatable Number(暴力)
    Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)
    Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)
    Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)
    Python位运算符
  • 原文地址:https://www.cnblogs.com/twodog/p/12137166.html
Copyright © 2011-2022 走看看