(12)python异常处理,python中的 try except

【1】基本形式

【1.0】一般形式

try:
    正文代码块1...
    正文代码块2...
    正文代码块3...
except 具体错误类别 as e:  # e为错误的具体信息变量
    print("该类错误信息为",e)
except Exception as e:   # Exception 为所有错误类别,但缩进、语法等错误无法捕捉,因为那属于编译错误,只能肉眼排查
    print("出错了,错误信息是:",e)
else:      # 如果 try 代码块没有异常错误,则会执行该模块
    正文代码块4...
finally:   # 无论是否报错,该代码块也会执行
    print("try except 代码块执行完毕")

案例

names = ['张三','李四']
data = {}
try:
    a = 1
except (KeyError,IndexError) as e:
    print("Key没有找到,或者下标异常错误:",e)
except IndexError as e:
    print("List 操作错误",e)
except Exception as e:
    print("未知错误",e)
else:
    print("如果没有异常发生,那么会执行我这个else,一切正常")
finally:
    print("不管报不报错,我这个finally 还是要执行的")

【1.1】错误信息

names = ['张三','李四']
data = {}
names[3]

File "D:/test.py", line 4, in <module>
names[3]
IndexError: list index out of range

names = ['张三','李四']
data = {}
data['name']

File "D:/郭超群/学习/python/project/学习笔记/第7周_反射_错误处理_网络编程/test.py", line 5, in <module>
data['name']
KeyError: 'name'

总结:

  我们可以发现,不同情况,有不同类别的错误

【1.2】try except 错误捕捉基本形式(常用)

names = ['张三','李四']
data = {}
try:
    names[3]
except KeyError as e:
    print("没有这个Key",e)
except IndexError as e:
    print("List 操作错误",e)

输出:

  List 操作错误 list index out of range

try:
    data['a']
except KeyError as e:
    print("没有这个Key",e)
except IndexError as e:
    print("List 操作错误",e)

输出:

  没有这个Key 'a'

【1.3】一个  except 包含多种错误类型捕获

通常用在,发生不同错误,但都用同一种错误处理方式

names = ['张三','李四']
data = {}
try:
    data['a']
except (KeyError,IndexError) as e:
    print("Key没有找到,或者下标异常错误:",e)

输出:

  Key没有找到,或者下标异常错误: 'a'

【1.4】捕获所有错误(except exception)

这个不常用,因为无法精准定位是什么类型

names = ['张三','李四']
data = {}
try:
    data['a']
except Exception as e:
    print("出错了:", e)

输出:

  出错了: 'a'

【1.5】try except else finally

names = ['张三','李四']
data = {}
try:
    a = 1
except (KeyError,IndexError) as e:
    print("Key没有找到,或者下标异常错误:",e)
except IndexError as e:
    print("List 操作错误",e)
except Exception as e:
    print("未知错误",e)
else:
    print("如果没有异常发生,那么会执行我这个else,一切正常")
finally:
    print("不管报不报错,我这个finally 还是要执行的")

【2】常用异常类型

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

【3】自定义错误抛出 raise

class DiyException(Exception):
    def __init__(self, msg):
        self.msg = msg

    def __str__(self):    # 这个方法可以不写,详情见下面分析
        return self.msg


try:
    raise DiyException("我的Diy异常!")
except DiyException as e:
    print("异常错误信息为:", e)

输出:

  异常错误信息为: 我的Diy异常!

分析:

  我们这里可以看到有一个 __str__ 函数,他的作用是,但打印该类的时候,就返回它中 return 的值

  如果没有写这个函数,那么则以元组形式,返回所有 __init__ 里面的输入入参,如果只有一个参数则输出形式为字符串,如下图

    

 如果写了个和系统错误类别一样的自定义错误类,那么则会覆盖

原文地址:https://www.cnblogs.com/gered/p/14060224.html