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

    # -*- coding: utf-8 -*-
    """
    什么是异常处理
        异常是错误发生的信号,一旦程序出错就会产生一个异常,
        如果该异常没有被应用程序处理,那么该异常就会被抛出来,程序的执行也会随之终止
        
        异常包含三个部分:
            1.traceback 异常的追踪信息
            2.异常的类型
            3.异常的信息
        
        为什么处理异常:
            避免程序因为异常而崩溃,所以在应用程序中应该对异常进行处理,从而增强程序的健壮性
        错误分为两大类:
            1.语法错误
            2.逻辑上的错误
        常见的异常类型:
            TypeError:类型错误
            IndexError:索引错误
            AttrbuiteError:属性错误
            等
            
        3 如何处理异常:
        try:
            代码1
            代码2
            .....
        except NameError:
            如果异常执行的代码块
    """
    
    try:
        ls = [1, 2, 3, 4]
        print(ls[10])
    except IndexError:
        print('索引错误')
    
    print('else code')
    
    # 索引错误
    # else code
    
    
    age = input(">>:").strip()
    if age > 10: print(age)  # TypeError: '>' not supported between instances of 'str' and 'int'
    
    
    import os
    
    os.xxx  # AttributeError: module 'os' has no attribute 'xxx'
    
    
    # 异常处理的多分支
    try:
        print('1============')
        print('2=============')
        d = {'x': 1, 'y': 2}  # KeyError
        print(d['z'])
        print('3===========')
        ls = [1, 2, 3, 4]
        print(ls[10])
        print('4==========')
    except IndexError as e:  # 其别名接收异常的值
        print('IndexError')
    except KeyError as e:
        print('KeyError', e)  # KeyError 'z'
    print('else code')
    # 1============
    # 2=============
    # KeyError  #
    # else code
    
    
    """
    万能异常类型: 特点---可以匹配任意类型的异常
        一般用于不管发什么异常,都用统一的代码块
            比如 针对 keyerror 用一段处理逻辑
                针对 indexerror 用一段处理逻辑
                其他异常 统一用一段处理逻辑
    """
    
    try:
        print('1============')
        print('2=============')
        d = {'x': 1, 'y': 2}  # KeyError
        print(d['z'])
        print('3===========')
        ls = [1, 2, 3, 4]
        print(ls[10])
        print('4==========')
    except IndexError as e:  # 其别名接收异常的值
        print('IndexError')
    except Exception as e:
        print('Exception', e)  # Exception 'z'
    print('else code')
    
    """
    try:
    
    exception:
    
    else:
    
    """
    
    try:
        print('1============')
        print('2=============')
        d = {'x': 1, 'y': 2}  # KeyError
        # print(d['z'])
        print('3===========')
        ls = [1, 2, 3, 4]
        # print(ls[10])
        print('4==========')
    except IndexError as e:  # 其别名接收异常的值
        print('IndexError')
    except Exception as e:
        print('Exception', e)  # Exception 'z'
        print('else code')
    else:
        print('else必须放在后面,else的子代码块会在被检测的代码块没有异常的时候运行执行')
    
    # 1============
    # 2=============
    # 3===========
    # 4==========
    # else必须放在后面,else的子代码块会在被检测的代码块没有异常的时候运行执行
    
    """
    finally:无论被检测的代码块是否异常,都会运行
    """
    
    try:
        print('1============')
        print('2=============')
        d = {'x': 1, 'y': 2}  # KeyError
        print(d['z'])
        print('3===========')
        ls = [1, 2, 3, 4]
        print(ls[10])
        print('4==========')
    except IndexError as e:  # 其别名接收异常的值
        print('IndexError')
    except Exception as e:
        print('Exception', e)  # Exception 'z'
        print('else code')
    else:
        print('else必须放在后面,else的子代码块会在被检测的代码块没有异常的时候运行执行')
    
    finally:
        print('无论是否有异常,都会执行,一般用于资源回收,不管有没有异常都回收')
    
    # 1============
    # 2=============
    # Exception 'z'
    # else code
    # 无论是否有异常,都会执行,一般用于资源回收,不管有没有异常都回收
    
    
    """
    自定义自己的异常类
    """
    
    
    # 主动触发异常:
    #     raise
    # print('1')
    # raise TypeError('类型错误')
    
    class MyException(BaseException):
        def __init__(self, msg):
            super().__init__()
            self.msg = msg
        
        def __str__(self):
            return '<%s>' % self.msg
    
    
    # raise MyException('我是自定义异常')
    # __main__.MyException: <我是自定义异常>
    
    # raise 抛异常
    class People:
        def __init__(self, name, age):
            self.__age = age
            self.__name = name
        
        def tell_info(self):
            print(self.__name, self.__age)
        
        def set_info(self, name, age):
            if not isinstance(name, str):
                raise TypeError('请传入字符串类型名字')
            if not isinstance(age, int):
                raise TypeError('请传入数字类型')
            else:
                self.__name = name
                self.__age = age
    
    
    # obj = People('qzk', 18)
    # obj.set_info(199, 'qqq')  # raise TypeError('请传入字符串类型名字')
    
    """
    断言
    """
    # 基本原理
    print('上半部分程序产生的数据')
    l = [1, 2, 3, 4]
    
    if len(l) != 5:
        raise Exception('列表长度必须为5')
    
    print('下半部分处理程序')
    
    #     raise Exception('列表长度必须为5')
    # Exception: 列表长度必须为5
    
    
    print('上半部分程序产生的数据')
    l = [1, 2, 3, 4]
    assert len(l) == 5
    print('下半部分处理程序')
    # 上半部分程序产生的数据
    # Traceback (most recent call last):
    #   File "E:/异常处理.py", line 222, in <module>
    #     assert len(l) == 5
    # AssertionError
  • 相关阅读:
    [转载]备忘:oh my zsh 的安装、更新、删除
    【转载】fedora22和win10之间的文件共享互访
    python3.7[列表] 索引切片
    注册科创版 等待生效中 测评 投资
    谷歌镜像-20190627
    debian静态地址网络配置方法
    latex高速新手教程
    Java知识点解析
    【Linux 操作系统】Ubuntu 配置 ftp freemind adb
    vs2012设置默认的全局include和lib
  • 原文地址:https://www.cnblogs.com/qianzhengkai/p/10787112.html
Copyright © 2011-2022 走看看