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

    一 异常和错误

    1.程序中难免出现错误,而错误分成两种
    1.语法错误(这种错误,根本过不了Python解释器的语法检测,必须在程序执行前就改正)

    #语法错误示范一
    if
    
    #语法错误示范二
    def test:
        pass
    
    #语法错误示范三
    print(haha
    

    2.逻辑错误

    #用户输入不完整(比如输入为空)或者输入非法(输入不是数字)
    num=input(">>: ")
    int(num)
    
    #无法完成计算
    res1 = 1/0
    res2 = 1+'str'
    

    2.异常
    异常就是程序运行时发生错误的信号,在Python中,错误触发的异常如下

    3.Python中的异常种类
    在python中不同的异常可以用不同的类型(Python中统一了类与类型,类型即类)去标识,不同的类对象标识不同的异常,一个异常标识一种错误

    二 异常处理

    什么是异常?
    异常就是我们语法上是没有问题,但是运行时就报错的称为异常, 异常发生之后剩余代码将不会继续执行
    什么是异常处理
    Python解释器检测到错误,触发异常(也允许程序员自己触发异常raise)
    程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关)
    如果捕捉成功则进入另外一个处理分支,执行你为其定制的逻辑,使程序不会崩溃,这就是异常处理
    为什么要进行异常处理?
    Python解析器去执行程序,检测到了一个错误时,触发异常,异常触发后且没被处理的情况下,程序就在当前异常处终止,后面的代码不会运行,谁会去用一个运行着突然就崩溃的软件。
    所以你必须提供一种异常处理机制来增强你程序的健壮性与容错性
    处理异常的两种方式:

    • 流程控制语句(if)
    • 异常处理 -- "私人订制"

    三 Python异常处理的'私人定制'

    Python:为每一种异常定制了一个类型,然后提供了一种特定的语法结构用来进行异常处理
    1 基本语法

    try:
         被检测的代码块
    except 异常类型:
         try中一旦检测到异常,就执行这个位置的逻辑
    ```python
    

    读文件示例

    f = open("userinfo","r",encoding="utf-8")
    while True:
        try:
            print(next(f))
        except StopIteration:
            f.close()
            break
            
     next(f)会触发迭代f,依次next(f)就可以读取文件的一行行的内容,无论文件userinf有多大,同一时刻内存中只有一行内容。当文件句柄f中的内容next完后就会抛出异常StopIteration后才可以执行f.close()
    2 异常类处理指定的异常情况
    

    未捕获到异常,程序直接报错

    s1 = 'hello'
    try:
        int(s1)
    except IndexError as e:   # as相当于将报错信息赋值给了e
        print e
    

    正确方法:

    s1 = 'hello'
    try:
        int(s1)
    except ValueError as e:
        print e
       
    # 报什么错,用什么错误类型去接受
    

    3 万能异常 - Exception
    他可以捕获任意异常,例如:

    s1 = 'hello'
    try:
        int(s1)
    except Exception as e:
        print(e)
    ```python
    

    你可能会说既然有万能异常,那么我直接用上面的这种形式就好了,其他异常可以忽略
    你说的没错,但是应该分两种情况去看
    如果你想要的效果是,无论出现什么异常,我们统一丢弃,或者使用同一段代码逻辑去处理,那么可以那么做

    s1 = 'hello'
    try:
        int(s1)
    except Exception,e:
        """丢弃或者执行其他逻辑"""
        print("编码逻辑")
    
    #如果你统一用Exception,没错,是可以捕捉所有异常,但意味着你在处理所有异常时都使用同一个逻辑去处理(这里说的逻辑即当前expect下面跟的代码块)
    

    4 多分支

    s1 = 'hello'
    try:
        int(s1)
    except IndexError as e:
        print(e)
    except KeyError as e:
        print(e)
    except ValueError as e:
        print(e)
    except Exception as e:
        print(e)
    

    5 异常的其他结构

    s1 = 'hello'
    try:
        int(s1)
    except IndexError as e:
        print(e)
    except KeyError as e:
        print(e)
    except ValueError as e:
        print(e)
    
    else:
        print('try内代码块没有异常则执行我')
    
    finally:
        print('无论异常与否,都会执行该模块,通常是进行清理工作')
    

    6 主动触发异常

    try:
        raise TypeError('类型错误')
    except Exception as e:
        print(e)
    

    7 自定义异常

    class EvaException(BaseException):
        def __init__(self,msg):
            self.msg = msg
        def __str__(self):
            return self.msg
    
    try:
        raise EvaException('类型错误')
    except EvaException as e:
        print(e)
    

    8 断言

    assert 条件
    assert 1 == 1
    assert 1 == 2
    
  • 相关阅读:
    Python类的继承(进阶5)
    面向对象编程基础(进阶4)
    Python模块(进阶3)
    Python函数式编程(进阶2)
    python多线程
    Ternary Search Tree Java实现
    Trie和Ternary Search Tree介绍
    索引时利用K-邻近算法过滤重复歌曲
    Sql排名和分组排名
    Lucene和jackson冲突
  • 原文地址:https://www.cnblogs.com/zzsy/p/12234132.html
Copyright © 2011-2022 走看看