zoukankan      html  css  js  c++  java
  • [python]python的异常处理

      

      异常处理:首先了解异常,程序出现逻辑错误或者用户输入不合法都会引发异常,而这些异常并不是致命的所以不会导致程序崩溃死掉。可以利用Python提供的异常处理机制在异常出现时及时捕获,并从内部自我消化。

      接下来一个例子来说明异常:

    1 file_name=input('请输入要打开的文件名:')
    2 f=open(file_name,'r')
    3 print('文件内容:')
    4 for each_line in f:
    5     print(each_line)

      这是一个简单的读取文件内容的例子,如果用户输入正确的文件名,文件内容得以显示。如果用户输入一个不存在的文件名,那么代码就会出现异常。如下1.txt并不存在:

      请输入要打开的文件名:1.txt
      Traceback (most recent call last):
      File "D:/python/p9_1.py", line 4, in <module>
      f=open(file_name,'r')
      FileNotFoundError: [Errno 2] No such file or directory: '1.txt'

      上面的例子就抛出了一个FileNotFoundError异常。

      以下是几种常见的异常类型:

      

      1.AssertionError:断言语句失败

      在分支和循环中当assert关键字后面的条件为假时,程序将停止并抛出AssertionError异常,一般在测试阶段用于在代码中置入检查点。

    1 #AssertionError异常
    2 my_list=['蔡徐坤']
    3 assert len(my_list)>0 #长度是否大于0
    4 print(my_list.pop()) #弹出
    5 assert len(my_list)>0

      Traceback (most recent call last):
      蔡徐坤
      File "D:/python/9_1_2.py", line 6, in <module>
      assert len(my_list)>0
      AssertionError

      2.AttributeError:尝试访问未知的对象属性

    1 #AttributeError异常
    2 my_list=[]
    3 my_list.wtf 

      Traceback (most recent call last):
      File "D:/python/p9_1_3.py", line 4, in <module>
      my_list.wtf
      AttributeError: 'list' object has no attribute 'wtf'

      3.IndexError:索引超出序列的范围

    1 #IndexError
    2 my_list=[1,2,3]
    3 my_list[3]

      Traceback (most recent call last):
      File "D:/python/p9_1_3.py", line 8, in <module>
      my_list[3]
      IndexError: list index out of range

      4.KeyError:字典中查找一个不存在的关键字

    1 #KeyError
    2 my_dict={"one":1,"two":2,"three":3}
    3 print(my_dict["one"])
    4 print(my_dict["four"])

      1
      Traceback (most recent call last):
      File "D:/python/p9_1_3.py", line 13, in <module>
      print(my_dict["four"])
      KeyError: 'four'

      

      5.NameError:尝试访问一个不存在的变量

    1 #NameError
    2 print(name)

      Traceback (most recent call last):
      File "D:/python/p9_1_3.py", line 16, in <module>
      print(name)
      NameError: name 'name' is not defined

      

      6.OSError:操作系统产生的异常

      如例子FileNotFoundError就是OSError的子类。

      

      7.SynataxError:Python的语法错误

       如下:任何错误的语法都会抛出改异常。 

    1 #SynataxError
    2 my_dict=asdxc}

      File "D:/python/p9_1_3.py", line 18
      my_dict=asdxc}
      ^
      SyntaxError: invalid syntax

      

      8.TypeError:不同类型间的无效操作

      有些类型不同不能进行相互计算,否则抛出该异常。

    1 #TypeError
    2 print(1+"1")

      Traceback (most recent call last):
      File "D:/python/p9_1_3.py", line 22, in <module>
      print(1+"1")
      TypeError: unsupported operand type(s) for +: 'int' and 'str'

      

      9.ZeroDivisionError:除数为0

    1 #ZeroDivisionError
    2 print(5/0) 

      Traceback (most recent call last):
      File "D:/python/p9_1_3.py", line 25, in <module>
      print(5/0)
      ZeroDivisionError: division by zero

      

      异常捕获可以使用try语句来实现,任何出现在try语句范围内的异常都会被及时捕获,有两种实现形式try-except和try-finally。

    1 #try-except
    2 try:
    3     f=open("no.txt")
    4     print(f.read())
    5     f.close()
    6 except OSError:
    7     print("文件打开遇到错误!")

      现在考虑以下这种情况(yes.txt是一个存在的文件):

    1 try:
    2     f=open("yes.txt")
    3     print(f.read())
    4     sum=1+"1"
    5     f.close()
    6 except:
    7     print("出现错误!")

      在sum=1+"1"出现异常,导致程序停止运行,而没有执行必要的f.close()操作需要保存文档,因此引入finally的概念,使必要操作最后得以执行。

    1 try:
    2     f=open("yes.txt")
    3     print(f.read())
    4     sum=1+"1"
    5 except:
    6     print("出现错误!")
    7 finally:
    8     f.close()

      针对不同异常设置多个except:

      

    1 try:
    2     sum=1+'1'
    3     f=open("no.txt")
    4     print(f.read())
    5     f.close()
    6 except OSError as reason:
    7     print("错误原因:"+str(reason))
    8 except TypeError as reason:
    9     print("错误原因:"+str(reason))

      对多个异常统一处理:

    1 try:
    2     sum=1+'1'
    3     f=open("no.txt")
    4     print(f.read())
    5     f.close()
    6 except(OSError,TypeError) as reason:
    7     print("错误出现!原因:"+str(reason))

      

      

    AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
    IOError 输入/输出异常;基本上是无法打开文件
    ImportError 无法引入模块或包;基本上是路径问题或名称错误
    IndentationError 语法错误(的子类) ;代码没有正确对齐
    IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
    KeyError 试图访问字典里不存在的键
    KeyboardInterrupt Ctrl+C被按下
    NameError 使用一个还未被赋予对象的变量
    SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
    TypeError 传入对象类型与要求的不符合
    UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
    ValueError 传入一个调用者不期望的值,即使值的类型是正确的

      详细说明请参考:https://docs.python.org/3/library/exceptions.html#base-classes

  • 相关阅读:
    nyoj 420
    nyoj 46 最少乘法次数
    ACM退役贴
    nyoj 187 快速查找素数
    多校4题目之Trouble
    nyoj 56 阶乘因式分解(一)
    nyoj 70 阶乘因式分解(二)
    nyoj 151 Biorhythms
    nyoj 97 兄弟郊游问题
    多校十 hdoj4393 Throw nails
  • 原文地址:https://www.cnblogs.com/zlc364624/p/11604046.html
Copyright © 2011-2022 走看看