zoukankan      html  css  js  c++  java
  • 异常与错误

    一.异常和错误
    什么是错误
    • 语法错误
      • 无法通过python解释器的语法检测
      • 在写代码的时候应该规避掉
    • 逻辑错误
     
    什么是异常
    • 程序运行时发生错误的信号
     
    什么时候容易发生异常
    • 当要处理的内容不确定的时候
      • 有用户参与
      • 有外接数据接入: 从文件中读 , 从网络上获取等
     
    异常信息的查看
     
     
    当有多行报错的时候是为什么
    在嵌套调用的过程中, 内部的代码出了问题, 外部所有的调用的地方都成为报错追溯信息的一部分.
     
    如何解决
    从下往上找, 首先找到出错的那一行代码, 如果能看出问题, 就直接解决
    不能, 就把报错的最后一行, 错误类型和详细提示贴到百度里, 结合报错的那一行去处理
     
    def func1():
        name
    def func2():
        func1()
    def main():
        func2()
    main()
     
    错误信息:
    Traceback (most recent call last):
      File "G:/utilities/Python/Python36/projects36/day20/4.异常基础处理.py", line 7, in <module>
        main()
      File "G:/utilities/Python/Python36/projects36/day20/4.异常基础处理.py", line 6, in main
        func2()
      File "G:/utilities/Python/Python36/projects36/day20/4.异常基础处理.py", line 4, in func2
        func1()
      File "G:/utilities/Python/Python36/projects36/day20/4.异常基础处理.py", line 2, in func1                        # 这一行是问题的源头
        name
    NameError: name 'name' is not defined                    # 如果无法解决, 就将该行信息粘贴到百度去处理
     
    二.异常处理
    1.什么是异常
    • 程序运行时发生错误的信号
    • 异常之后的代码就不执行了
     
    2.什么是异常处理
    • python解释器检测到错误, 触发异常
    • 程序员编写特定的代码, 专门用来捕捉这个异常
    • 如果捕捉成功则进入另外一个处理分支, 执行你为其定制的逻辑, 使程序不会崩溃, 这就是异常处理
     
    3.为什么要进行异常处理
    python解释器去执行程序, 检测到了一个错误时, 触发异常, 异常触发后且没被处理的情况下, 程序就在当前异常处终止, 后面的代码不会运行, 非常非常影响用户体验
    需要提供一种异常处理机制来增强你程序的健壮性与容错性
     
    4.如何进行异常处理
    首先须知, 异常是有程序的错误引起的, 语法上的错误跟异常处理无关, 必须在程序运行前就处理
     
    5.异常处理的几种写法
     
    单分支
    try:
        被检测的代码块
    except 异常类型:
        try中一旦检测到此处的异常类型, 就执行这里的逻辑
     
    多分支
    try:
        被检测的代码块
    except 异常类型1:
        try中一旦检测到此处的异常类型, 就执行这里的逻辑
    except 异常类型2:
        try中一旦检测到此处的异常类型, 就执行这里的逻辑
    except ...
     
    注: 
    1. 报错的代码信息会从上向下进行查找, 只要找到和报错类型相符的分支, 就停止查找, 执行这个分支中的代码, 然后直接退出分支
    2. 如果找不到能处理和报错类型相同的分支, 会一直往下走, 最后还是没有找到就会报错
     
    多分支合并
    try:
        被检测的代码块
    except (异常类型1, 异常类型2, 异常类型3, ...):
        try中一旦检测到此处的异常类型, 就执行这里的逻辑
     
    万能异常
    # 写法一:
    try:
        被检测的代码块
    except Exception:
        try中出现的所有异常, 都会执行这里的逻辑
     
     
    # 写法二:
    try:
        被检测的代码块
    except:
        try中出现的所有异常, 都会执行这里的逻辑
     
    注:
    不会打印错误的信息
     
    as语法
    • 常和万能异常搭配使用
    • 其他单分支或多分支等也是都可以使用的
    try:
        name
    except Exception as e:        # 这里的e就是一个变量, 写什么都可以
        print(e)                              # 打印错误信息
     
    注:
    Exception 使用as语法, 用来打印错误信息
     
    多分支 + 万能异常
    try:
        被检测的代码块
    except 异常类型1:
        try中一旦检测到此处的异常类型, 就执行这里的逻辑
    except 异常类型2 as e:                                                        # 这里也可以使用as语法的哦!
        try中一旦检测到此处的异常类型, 就执行这里的逻辑
    except Exception as e:
        print(e)
        不满足上面的异常类型时, 都会执行这里的逻辑
     
    注: 
    万能异常永远在异常处理的最下面
     
    else分支
    try:
        被检测的代码块
    except 异常类型:
        try中一旦检测到此处的异常类型, 就执行这里的逻辑
    else:
        当try中代码不发生异常的时候, 走else分支
     
    注: 应用场景
    发邮件, 当网络稳定的时候或邮箱地址错误时, 重新发送
    当发送成功时, 进行后续的处理
     
    finally分支
    try:
        被检测的代码块
    except 异常类型1:
        try中一旦检测到此处的异常类型, 就执行这里的逻辑
    except 异常类型2:
        try中一旦检测到此处的异常类型, 就执行这里的逻辑
    except Exception as e:
        print(e)
        不满足上面的异常类型时, 都会执行这里的逻辑
    else:
        当try中代码不发生异常的时候, 走else分支
    finally:
        无论如何都会被执行
     
    应用场景:
    例如打开一个文件操作, 如果文件打开了在操作的过程中, 出现问题, 有finally那文件就可以被关闭; 没有出现问题, 文件也会被关闭.
    所以, finally可以用来回收一些操作系统的资源: 数据库连接, 打开的文件句柄, 网络连接等
     
    注: 
    1. 有finally时, finally在最下面
    2. 注意这里写的顺序
     
    6.其他操作
    6.1主动抛出异常
    raise
    • 这个是给其他开发者用的, 而不是给用户抛的
    • 例如:我们使用别人开发的框架, 在使用时可以给我们主动抛出异常让我们处理, 而我们开发完毕的程序, 是不能抛出异常给用户看的, 这样是很不友好的
     
    raise ValueError('你写的不对呀!')
     
    结果:
    ValueError: 你写的不对呀!
     
    6.2断言
    assert
     
    assert 1 == 1        # 条件成立, 程序继续往下执行
     
    assert 1 == 2        # 条件不成立, 程序不会继续往下执行
  • 相关阅读:
    高性能TcpServer(Java)
    高性能TcpServer(C#)
    高性能TcpServer(C#)
    高性能TcpServer(C#)
    高性能TcpServer(C#)
    高性能TcpServer(C#)
    高性能TcpServer(C#)
    MySQL连表Update修改数据
    windows服务器安装安全狗时服务名如何填写
    织梦ckeditor编辑器 通过修改js去除img标签内的width和height样式
  • 原文地址:https://www.cnblogs.com/facelessmen/p/9520679.html
Copyright © 2011-2022 走看看