异常处理

一.程序中难免会出现错误,错误分为两种:

  1.语法错误  (应该在写代码的时候就规避掉)

  2.逻辑错误

二.程序中经常遇到的错误种类

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

1.当要处理的内容不确定的时候:
(1)有用户参与
(2)有外界数据介入:从文件中读或或从网络上获取

四.处理

1.单分支
try:
  被检测的代码块
except:
    当try中检测到异常时,执行此时的逻辑
l = ['酸甜','麻辣']
for num,i in enumerate(l,1):
    try:
        num = int(input('num >>>'))
    except ValueError :        #当num输入非数字时,会报ValueError,except后添加异常的类型
        print('请输入一个数字')
    print(l[num - 1])

2.多分支

l = ['酸甜','麻辣']
for num,i in enumerate(l,1):
    try:
        num = int(input('num >>>'))
        print(l[num - 1])
    except ValueError :
        # 从上向下报错的代码只要找到一个和报错类型相符的分支就执行这个分支中的代码,然后直接退出分支
        print('请输入一个数字')
    except IndexError :
        # 如果找不到能处理和报错类型相同的分支,会一直往下走,最后还是没有找到就会报错
        print('只能输入1或2')

也可以将多分支合并,将except加多个错误类型

l = ['酸甜','麻辣']
for num,i in enumerate(l,1):
    try:
        num = int(input('num >>>'))
        print(l[num - 1])
    except (ValueError,IndexError) :
        print('请输入1或2')

3.万能异常

exception可以捕捉任意异常

*如果想将多个不同的异常用同一段代码或同一逻辑处理可用exception;如果想将不同的错误异常分别用不同逻辑处理,还是用多分支啦!

若将多分支和万能异常放在一起用,必须将万能异常放在最下面.多分支最好对应写好针对性处理的逻辑,万能异常对应通用性逻辑.

4.as语法能将具体错误信息打印出来

5.else分支

当try中的代码没有异常时,会执行else分支.

6.finally分支

无论什么时候都会被执行



原文地址:https://www.cnblogs.com/liuqingyang/p/9494080.html