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,其它的逻辑错误应该尽量修正。

     

  • 相关阅读:
    青檬音乐台闲时听听电台吧
    [转]What is AOP?
    实现页面元素拖动效果的JS函数
    gorithms.算法概论.习题答案
    Asp.Net读取并显示Excel文件中的内容(OleDb方式)
    收藏的一些小软件
    Master Page Path (MasterPage 相对路径)
    rundll32 netplwiz.dll,UsersRunDll
    关于锁
    我的回帖保存
  • 原文地址:https://www.cnblogs.com/yinzhengjie/p/8727011.html
Copyright © 2011-2022 走看看