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

    一.什么是异常
    指的是 与正常情况不同
    在程序中 程序的正常执行过程 按照代码顺序 一行一行很执行 知道所有代码都执行完
    如果在执行过程中 出现了错误 导致代码无法执行完毕 就称之为异常

    即 异常其实就是代码执行过程中出错了


    常见的异常类型

    当异常发生时 解释器 会打印异常详细信息 并且终止程序的执行


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

    2.别人写的模块是有可能出错的 所以 你可以按照追踪信息点击去看看
    绝招:如果有很多追踪信息 找最后一行是你自己写代码的位置
    2.查看异常类型 例如:IndexError
    3.查看异常的值 例如: list index out of range

    如果没有任何异常信息 但是程序就是不对 可以使用
    排除法


    异常的三个组成部分
    追踪信息
    异常类型
    异常的值

    异常一旦发生就会导致程序终止 这对于用户而言体验极差 所以我们需要有一种机制
    能够防止程序因为异常而终止

    常见的错误
    """
    # a =
    # SyntaxError: invalid syntax   语法错误
    
    # age
    # NameError: name 'age' is not defined   名字不存在
    
    #open("asasasas")
    # FileNotFoundError: [Errno 2] No such file or directory: 'asasasas'  路径错误
    
    # f = open("1.今日内容")
    # f.close()
    # f.read()
    #ValueError: I/O operation on closed file.   文件已经关闭  你还要去读写
    
    #f = open("1.今日内容",mode="rt",encoding="utf-8")
    #f.write("123")
    # io.UnsupportedOperation: not writable 不能写入数据  读写模式错误导致
    
    
    #int("abc")
    # ValueError: invalid literal for int() with base 10: 'abc' 数据的值错误导致
    
    
    # def func():
    #  print(1)
    #   print(2)
    # IndentationError: unexpected indent   缩进错误
    
    
    li = []
    li[1]
    # IndexError: list index out of range   索引不存在
    
    # dic = {}
    # dic["name"]
    # KeyError: 'name'   key不存在
    
    
    
    
    
    
    # a =
    # print("hello")
    View Code
    二.异常可以由 发生的时间不同分为两类
    1.语法检测异常
    解释器在执行代码前会先检测语法 检测通过才会开始执行
    如果这个阶段发生了异常 代码一行都不会执行
    语法错误 和 缩进错误
    这种低级错误 就别问了
    2.运行时异常
    已经通过了语法检测 在解析执行期间发生的异常

    处理异常的几种方法
    """
    print("start")
    
    a = int("abc")
    
    print("over")
    
    li = []
    # 语法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)
    
    
    """
    View Code
    """
    完整的书写顺序
    try
    except
    else
    finally
    """
    # 你需要掌握的语法
    """
    1.
    try:
    except:

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



  • 相关阅读:
    Count and Say leetcode
    Find Minimum in Rotated Sorted Array II leetcode
    Find Minimum in Rotated Sorted Array leetcode
    Search in Rotated Sorted Array II leetcode
    search in rotated sorted array leetcode
    Substring with Concatenation of All Words
    Subsets 子集系列问题 leetcode
    Sudoku Solver Backtracking
    Valid Sudoku leetcode
    《如何求解问题》-现代启发式方法
  • 原文地址:https://www.cnblogs.com/liubinliuliu/p/10375134.html
Copyright © 2011-2022 走看看