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

    异常基础

    我们在写程序的时候难免会出现错误,一种为语法错误,即为python解释器的语法检测出来的错误,这种错误只能在我们执行程序之前及处理好。另一种为逻辑错误,这是我们在程序设计时出现得错误,也就是我们平时所说的bug。在编程过程中为了增加友好性,在程序出现bug的时候,一般不会将错误信息显示给用户,而是显示一个提示错误的页面。

    异常种类

    在python中不同异常可以用不同的类型去标识,不同的类对象标识不同的异常,一个异常标识一种错误。

    常见异常
    更多异常

    什么是异常处理:

     

    python解释器捕捉到错误,触发异常(程序员也可以自己触发异常)

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

    如果捕捉成功,会进入另一个处理分支,使得程序不会崩溃,这就是异常处理。

    为什么要进行异常处理:

    python解释器在执行程序,检测到一个错误的时候,触发异常,异常触发后如果没有处理的情况下,程序会再当前异常终止,后面的代码就不会运行,这意味着你的程序崩溃了。

    所以需要一种异常处理的机制来增强你程序的容错性。

    如何进行异常处理:

    首先,异常是由程序的错误引起的,但是语法上的错误跟异常处理无关,只能在程序运行前修正。

    基本语法:

    try:
        pass#被检测的代码块
    except Exception as e:
        pass#错误提示

    实例:

    try:
        num = input('please input you num:')
        #遇到无法int的对象使用except捕捉
        int(num)
        #捕捉Value 错误,返回错误
    except ValueError as e:
        print(e)
    # 执行结果
    #please input you num: name
    # invalid literal for int() with base 10: ' name'

    在try 代码中只要出现异常,那么代码块中异常后面的代码就不会执行了,一个异常类只能用来处理指定的异常情况,如果非指定异常则无法处理。

    多分支:

    age = input('age:')
    try:
        int(age)
    except IndexError as e:#未捕捉到错误
        print(e)
    except KeyError as e:#未捕捉到错误
        print(e)
    except ValueError as e:#捕捉到错误
        print('请输入数字')
    #######执行结果##########
    # age:f   输入类型不是数字
    # 请输入数字      捕捉到错误,返回提示信息

    多分支扩展:

    print('执行结果'.center(30,"#"))
    age = input('age:')
    try:
        int(age)
    except IndexError as e:
        print(e)
    except KeyError as e:
        print(e)
    except ValueError as e:
        print('请输入数字')
    else:
        print('没try出来错误执行,try出来错误就不执行')
    finally:
        print('不管你有没有try出来错误都执行我')
    
    print('执行结果'.center(30,"#"))
    #############执行结果#############
    # age:ddd
    # 请输入数字
    # 不管你有没有try出来错误都执行我
    #############执行结果#############

    万能异常

    每一类错误都用一种类对象标识,太麻烦了,这个时候你就需要万能异常了,各种错误一网打尽。

    但是还有三个漏网之鱼,SystemExit , KeyboardInterrupt 和 GeneratorExit 三个异常是Exception搞不定的。

    print('执行结果'.center(30,"#"))
    age = input('age:')
    try:
        int(age)
    except Exception as e:#不使用ValueError照样能捕捉到错误
        print(e)
    print('执行结果'.center(30,"#"))
    #############执行结果#############
    # age:s
    # invalid literal for int() with base 10: 's'
    #############执行结果#############

    主动触发异常

    print('执行结果'.center(30,"#"))
    try:
        raise TypeError('类型错误')
    except Exception as e:
        print(e)
    print('执行结果'.center(30,"#"))
    #############执行结果#############
    # 类型错误
    #############执行结果#############

    自定义异常

    通过继承BaseException实现

    print('执行结果'.center(30,"*"))
    class NaniException(BaseException):
        def __init__(self,msg):
            self.msg = msg
        def __str__(self):
            return self.msg
    try:
        raise NaniException('纳尼错误')
    except NaniException as e: #捕获NaniException
        print(e)
    finally:
        print('执行结果'.center(30,"*"))
    # *************执行结果*************
    # 纳尼错误
    # *************执行结果*************

    断言

    判断条件成立,不成立就出现AssertionError异常

    try:
        assert 1 == 1
        print('第一个断言成功就执行')
        assert 2 == 1
        print('第二个断言失败不执行')
    except Exception as e:
        print('抓到错误')

    注意:

      不要再任何地方都使用try......except,因为它本身就是你附加给你程序的一种异常处理的逻辑,与你的主要工作是没有关系的,大量使用,会导致你的程序的可读性变差,只有在有些异常无法预知的情况下,才应该使用try...... except,其它的逻辑错误应该尽量自行修正。

  • 相关阅读:
    【转】在Ubuntu上下载、编译和安装Android最新源代码
    【转】Linux(ubuntu14.04)上编译Android4.4源码的环境搭建及编译全过程
    linux kernel API and google android compile guide
    【转】如何单独编译Android源代码中的模块--不错
    【转】Android源代码编译命令m/mm/mmm/make分析--不错
    【转】linux设备驱动之MMC SD卡——核心层简单分析
    DELL笔记本拆机添加内存条
    【转】windows7 64位系统认不出8g内存显示只有3G可用
    matlab 神经网络工具箱的实用
    学习算法收敛条件的判断
  • 原文地址:https://www.cnblogs.com/shengzhongqiu/p/7396383.html
Copyright © 2011-2022 走看看