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

    """
    class MyMeta(type):
    # 用于新建类对象
    def __new__(cls, *args, **kwargs):
    print(MyMeta)
    # print(*args)
    # print(**kwargs)
    # 调用type通过__new__方法来创建一个空的类对象,已经将三个组成部分都放到类对象中了
    res = type.__new__(cls,*args)
    return res

    def __init__(self,class_name,bases,namespace):
    print("init,run")
    print(self)


    class Student(metaclass=MyMeta):
    pass

    # print(Student)
    """

    """
    new和init的区别
    new比init先执行,其作用是创建一个空的类对象
    作为一个类对象,必须具备三个组成部分,所以调用type中的new来完成组装
    得到这个类对象后需要将其返回,以供init来使用

    """

    """
    异常:
    与正常情况不同
    在程序中,程序的正常执行过程,一行一行执行,直到所有代码都执行完
    如果在执行过程中出现了错误,导致了代码无法执行完毕,就称之为异常
    异常就是代码执行过程中出错了

    常见的异常:


    """
    # 1.语法错误
    # a =
    # SyntaxError: invalid syntax

    # 2.名字不存在
    # age
    # NameError: name 'age' is not defined

    # 3.路径错误
    # open("assas")
    # FileNotFoundError: [Errno 2] No such file or directory: 'assas'

    # 4.文件已经关闭 你还要去读写
    # f = open("1.今日内容")
    # f.close()
    # f.read()
    #ValueError: I/O operation on closed file.

    # 5.不能写入数据 读写模式错误导致
    #f = open("1.今日内容",mode="rt",encoding="utf-8")
    #f.write("123")
    # io.UnsupportedOperation: not writable

    # 6.数据的值错误导致
    #int("abc")
    # ValueError: invalid literal for int() with base 10: 'abc'

    # 7.缩进错误
    # def func():
    # print(1)
    # print(2)
    # IndentationError: unexpected indent

    # 8.索引不存在
    # li = []
    # li[1]
    # IndexError: list index out of range

    # 9.key不存在
    # dic = {}
    # dic["name"]
    # KeyError: 'name'

    """
    如何排查错误
    1.定位到错误发生的位置
    查看追踪信息
    1.如果你的代码都是自己写的,没有调用任何内置模块或方法,那么错误发生位置一定在最后一行
    2.如果你的代码调用其他模块的方法
    1.是系统内置的模块,object.py 不用去查看object类,它几乎不可能出错
    一定是你自己代码在调用时出了错误
    2.别人写的模块是有可能出错的,所以你可以按照追踪信息电击去看看

    如果有很多追踪信息,找最后一行是你自己写代码的位置
    查看异常的类型
    查看异常的值
    如果没有任何异常信息,但程序就是不对,可以使用
    排除法


    异常可以由发生的时间不同分为两类
    1.语法检测异常
    解释器在执行代码前先检测语法,检测通过才会执行
    2.运行时异常
    已经通过了语法检测,在解析执行期间发生的异常


    """
    # 语法1:
    """
    try:
    print("start")

    a = int("abc")

    print("over")

    except ValueError:
    # 当try中真的发生了错误,就会执行 except中的代码
    # 在这里可以做一些补救措施
    print("发生了ValueError异常")
    """
    # 语法2:万能异常,程序既不报错也不会执行,无法定位错误位置
    """
    try:

    print("start")
    10/0

    print("over")

    except Exception:
    print("就是出错了")

    # 可以通过给异常取别名,来获取异常的对象,对象中包含了错误信息
    except Exception as e:
    print("..")
    print(e)
    print(type(e))
    print("over")
    """

    """
    class LoginException(Exception):
    pass
    # 语法1
    # try:
    # # 把可能发出错误的代码放到try中
    # print("start")
    # # a = int("abc")
    # li[1]
    # print("over")
    #
    # except ValueError:
    # # 当try中真的发生了错误 就会执行 except中的代码
    # # 在这里可以做一些补救措施
    # print("发生了 ValueError异常")
    #
    # print("over")

    # # 语法2 except可以有多个
    # try:
    # # 把可能发出错误的代码放到try中
    # print("start")
    # a = int("abc")
    # li[1]
    # print("over")
    #
    # except ValueError:
    # # 当try中真的发生了错误 就会执行 except中的代码
    # # 在这里可以做一些补救措施
    # print("发生了 ValueError异常")
    # except IndexError:
    # print("发生了 IndexError 索引不正确")
    # print("over")


    # 语法4 万能异常 Exception类 尽量少用 可能会导致 程序既不报错 也不正常运行 无法定位错误位置
    # try:
    # # 把可能发出错误的代码放到try中
    # print("start")
    # # a = int("abc")
    # # li[1]
    # 10 / 0
    # dic = {}
    # dic["name"]
    # print("over")
    #
    # except Exception:
    # print("可能是任何类型的错误 反正是发生错误了")
    # print("over")


    # 语法5 万能异常 Exception类 建议 输出异常的值
    # try:
    # # 把可能发出错误的代码放到try中
    # print("start")
    # # a = int("abc")
    # # li[1]
    # 10 / 0
    # dic = {}
    # dic["name"]
    # print("over")
    #
    # # 可以通过给异常取别名 来获取异常的对象 对象中包含了错误信息
    # except Exception as e:
    # print("可能是任何类型的错误 反正是发生错误了")
    # print(e)
    # print(type(e))
    # print("over")


    # # 语法6 先捕获能够明确的异常类型 最后捕获万能异常类型
    # try:
    # # 把可能发出错误的代码放到try中
    # print("start")
    # # a = int("abc")
    # # li[1]
    # # 10 / 0
    # dic = {}
    # dic["name"]
    # print("over")
    # except ValueError:
    # print("值不对.....")
    # except ZeroDivisionError:
    # print("除数不能为0")
    # # 可以通过给异常取别名 来获取异常的对象 对象中包含了错误信息
    # except Exception as e:
    # print("可能是任何类型的错误 反正是发生错误了")
    # print(e)
    # print(type(e))
    #
    # print("over")


    # 语法7 try except else
    # try:
    # # 把可能发出错误的代码放到try中
    # print("start")
    # # a = int("abc")
    # # li[1]
    # # 10 / 0
    # dic = {}
    # # dic["name"]
    # print("over")
    # except ValueError:
    # print("值不对.....")
    # except ZeroDivisionError:
    # print("除数不能为0")
    # # 可以通过给异常取别名 来获取异常的对象 对象中包含了错误信息
    # except Exception as e:
    # print("可能是任何类型的错误 反正是发生错误了")
    # print(e)
    # print(type(e))
    # else: #当没有发生异常会执行else 只能except的后面
    # print("执行了else")
    # print("over")

    # 语法8 try except finally
    # try:
    # # 把可能发出错误的代码放到try中
    # print("start")
    # # a = int("abc")
    # # li[1]
    # # 10 / 0
    # dic = {}
    # # dic["name"]
    # print("over")
    # except ValueError:
    # print("值不对.....")
    # finally: #无论是否发生异常 最后都会执行finally中的代码
    # print("finally")
    # print("over")


    import io
    # finally的使用场景 可以用finally来执行一些清理操作 类似__del__
    try:
    print("start")
    f = open("1.今日内容","rt",encoding="utf-8")
    f.read()
    print("end")
    except FileNotFoundError:
    print("文件路径错误...")
    except io.UnsupportedOperation:
    print("文件不能被写入....")
    finally:
    f.close()


    print(f.closed)

    """

    # 你需要掌握的语法
    """
    1.
    try:
    except:

    2.
    try:
    except:
    finally:
    """
    # 正确使用异常处理
    """
    1.如果能明确知道异常发生原因 就不要产生异常 使用if判断等方式
    2.不知道异常发生的原因 但是知道异常的类型 那就明确捕获该类型的异常
    3.不知道发生原因 也不知道 异常的类型 可以使用万能异常 但是一定要打印异常消息
    """

    """
    做一个登录功能 如果登录失败就抛异常
    """

    # 主动抛出异常
    # 当你写了一些功能 是提供给别人用的 然而使用者不按照你的方式来使用,就会导致程序出错
    # 而且我们无法帮助用户处理这个错误
    # 这时候就可以主动抛出异常
    # raise 关键字 后面跟 任意Exception类型的子类


    # 自定义异常类型
    # class LoginException(Exception):
    # pass
    #
    # def login():
    # name = input("username:").strip()
    # pwd = input("password:").strip()
    #
    # if name == "blex" and pwd == "123":
    # print("登录成功!")
    # else:
    # raise LoginException("用户名或密码不正确....")
    #
    # login()


    """
    断言
    其实就是断定意思,确定某个条件一定成立的
    有一段代码 要执行必要保证某个条件是成立的
    """
    # 使用断言来简化代码,断言后面跟一个bool类型表达式,如果结果为True则继续往下执行

    # names = [111]
    # assert names
    # print("..........aaa")
    # print("..........aaa")
    # print("..........aaa")
    # print("..........aaa")

  • 相关阅读:
    如何快速给pod添加健康检查?
    如何快速下载vagrant的box?
    如何快速新建sql的demo环境?
    如何快速将某个用户添加sudo免密以及docker权限?
    七、Docker+nginx
    六、Docker+Gitlab
    五、Docker+Sqlserver
    四、Docker+Tomcat
    Docker 内程序时间设置,很重要
    三、Docker镜像的相关操作
  • 原文地址:https://www.cnblogs.com/xuezhihao/p/10149507.html
Copyright © 2011-2022 走看看