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

    语法错误

    错误一般就是指语法错误,也是解析错误;通常在IDE已经会提醒有语法错误了

    while True
        print("test")

    执行结果

      File "C:/异常.py", line 11
        while True
                 ^
    SyntaxError: invalid syntax

    解析器会报错,直接指向语法有错的地方

    重点!异常

    描述:异常一般在ide无法直接检测出来,在我们执行到代码语句时,若有异常则会自动抛出

    内置异常

    BaseException

    • 所有内置异常的基类
    • 需要自定义异常类的时候不能继承它

    Exception

    • 所有内置的非系统退出类异常都继承自此类
    • 所有自定义异常类都应该继承此类

    ArithmeticError

    各种算术类错误而引发的内置异常: OverflowError, ZeroDivisionError, FloatingPointError

    LookupError

    当映射或序列所使用的的键或索引无效时引发的异常:IndexError、KeyError,都是继承该类

    常见的具体内置异常

    均是Exception的子类

    AssertionError:assert断言失败时引发

    AttributeError:属性引用(如: 实例对象.方法 )失败或赋值失败(如: 对象=值 )

    ImportError:加载模块失败时引发,如: from list import test ,若找不到test则报此异常

    ModuleNotFoundError:当一个模块找不到时引发,如: import testss ,testss不存在则报此异常;是ImportError的子类

    IndexError:取序列索引超出范围

    KeyError:在字典中找不到指定的Key

    TypeError:当一个操作或函数被应用于类型不适当的对象时将被引发,传入参数的类型错误(如:传了string给一个int类型的参数)

    ValueError:当传入的参数类型正确,但值不正确时引发(如:传入要求范围之外的数值)

    UnicodeEncodeError:编码错误

    UnicodeDecodeError:解码错误

    OSError:调用操作系统函数时报错引发该异常,一般是I/O操作

    OS 异常

    以下所有异常都是OSError的子类

    FileExistsError:文件已存在(如:创建一个文件)

    FileNotFoundError:文件找不到(如:open一个文件)

    PermissionError:没有权限操作文件(如:写入内容到一个正在打开的文件)

    IsADirectoryError:对目录进行文件操作(如:os.remove() 传入目录路径)

    NotADirectoryError:对文件进行目录操作(如:os.listdir() 传入文件路径)

    警报

    部分异常只是当做警告类别

    DeprecationWarning:过时,已被弃用的特性相关警告

    Python中处理异常

    try:
        x = int(input("Please enter a number: "))
        x.open()
        print("继续执行try")
    except AttributeError:
        print("AttributeError")
    except ValueError:
        print("ValueError")

    try语句的工作原理

    • 首先,执行  try 子句

    • 如果没有异常发生,则不执行  except 里面的代码,并执行  try 里面剩下的代码。

    • 如果在执行 try 里面代码时发生了异常,则不再执行剩下代码,如果抛出异常的类型和  except 的异常类匹配,则执行  except 里面的代码

    • 如果抛出的异常没有被 except 的异常类匹配上,则直接抛出原生异常,在控制台打印

    多个except和else

    import sys
    
    try:
        f = open('myfile.txt')
        s = f.readline()
        i = int(s.strip())
    except OSError as err:
        print("OS error: {0}".format(err))
    except ValueError:
        print("Could not convert data to an integer.")
    except:
        print("Unexpected error:", sys.exc_info()[0])
        raise
    else:
        print("没异常才执行")

    执行结果

    # 若找不到myfile.txt
    OS error: [Errno 2] No such file or directory: 'myfile.txt'
    
    # 若找到文件了,但里面包含字母
    Could not convert data to an integer.
    
    # 其他异常
    Unexpected error:

    知识点

    • 最后一个 except 不指定异常类时,可以作为通配符,若前面所有异常类都没有匹配上,则会自动匹配这个 except ,并执行里面代码,注意:最好要raise一下,否则不知道异常是什么
    • 如果写 else 必须放在所有 except 后面
    • else 的作用:当try里面的代码没有异常时就执行else里面的代码,可以理解成: try 里面写有可能发生异常的代码块,而 else 里面写若无异常则正常执行的代码块

    try、else里面的return优先级

    def test1():
        while True:
            try:
                print("没异常的print")
                return "try"
            except ValueError:
                print("Could not convert data to an integer.")
            else:
                print("没异常才执行")
                return "else"
    
    print(test1())

    执行结果

    没异常的print
    try

    知识点

    try、else里面都有 return 代码时,会优先执行try里面的,且不再执行else里面所有代码

    finally

    while True:
        try:
            print("没异常的print")
            break
        except ValueError:
            print("Could not convert data to an integer.")
        else:
            print("没异常才执行")
        finally:
            print("无论是否报异常都会执行")

    执行结果

    没异常的print
    没异常才执行
    无论是否报异常都会执行

    知识点

    • finally 的代码块,无论是否报异常都会执行
    • finally的作用:一般写清理关闭操作,如:关闭文件、关闭数据库连接等等
    • 若没有 break 、 continue 、 return 、异常,执行顺序是:try - else - finally
    • try 里面有 break 、 continue 、 return ,在执行 break 、 continue 、 return 前也得执行 finally 代码块,且不执行 else 代码块
    • 若 try 和 finally 里面都有 return ,则优先执行 finally 的 return ,如下代码
    def test2():
        try:
            print("没异常的print")
            return "try"
        except ValueError:
            print("Could not convert data to an integer.")
        finally:
            print("无论是否报异常都会执行")
            return "finally"
    
    print(test2())

    执行结果

    没异常的print
    无论是否报异常都会执行
    finally
  • 相关阅读:
    Effective Go(官方文档)笔记
    Python中的列表、元祖、字典
    obj-c编程15[Cocoa实例02]:KVC和KVO的实际运用
    HDU 3435A new Graph Game(网络流之最小费用流)
    蜗牛—Android基础之button监听器
    网络流小结
    Android 音频的播放之二MediaPlayer
    零基础学python-3.7 还有一个程序 python读写文本
    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第11章节--为Office和SP解决方式开发集成Apps Office的JavaScript对象模型
    jdk的动态代理源代码解析
  • 原文地址:https://www.cnblogs.com/poloyy/p/12559757.html
Copyright © 2011-2022 走看看