Python异常处理

1、异常概述

(1)异常:Python用异常对象来表示异常情况,遇到错误后,会引发异常,如果异常对象未被处理捕捉,程序就会用所谓的回溯终止执行

(2)异常处理:程序出现bug时不将错误信息显示给用户,而是现实一个提示的页面

2、常见python 异常:

(1)AttributeError:试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x

(2)IOError:输入/输出异常;基本上是无法打开文件

(3)ImportError:无法引入模块或包;基本上是路径问题或名称错误

(4)IndentationError:语法错误(的子类) ;代码没有正确对齐

(5)IndexError:下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]

(6)KeyError:试图访问字典里不存在的键

(7)KeyboardInterrupt:Ctrl+C被按下

(8)NameError:使用一个还未被赋予对象的变量

(9)SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)

(10)TypeError:传入对象类型与要求的不符合

(11)UnboundLocalError:试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它

(12)ValueError:传入一个调用者不期望的值,即使值的类型是正确的

3、 抓取异常

try:
    name = "dayi123"
    age = int(name)
except Exception as e:    #抓取所有的异常,并将异常错误信息赋值给e
    print("error:")
    print(e)

4、根据异常错误抓取异常

#IO错误
try:
    with open('dayi123.txt','r') as f:
        print(f.read())
except IOError:    #文件不存在时会执行下面语句
    print("no file ")#下标错误
try:
    name = ["dayi","xiaowang","xiaoli"]
    name[4]
 
except IndexError as e: #如果访问列表中的元素不存在,则报下面错误
   print("下标错误")

5、同时抓取多个异常

try:
    name = ["dayi","xiaowang","xiaoli"]
    name[2]
    info_dict = {'name':"dayi",'age':18,'job':"it"}
    info_dict["mail"]   #访问字典里不存在的key
except (IndexError,KeyError) as e:   #同时抓取两个错误
    print("下标错误或键错误")

6、分类抓取异常

try:       #将要抓的异常程序写在try下
    name = "dayi"
    name_list = ['xiaochen','eric','jack']
    age = int(name)
    print(name)
    print(name_list[4])
except NameError as err:    #若果异常关键字为NameError,则执行下面内容
    print(err)
except IndexError as err:   #若果异常关键字为IndexError,则执行下面内容
    print(err)
    print('do sth to make up..........')
except Exception as e:      #抓取所有的异常并将异常信息赋给e
    print('---->some error i do not know:',e)
else:                    #如果没有异常,则执行下面内容
    print("---no err happend---")
finally:               #不管有没有异常,都会执行下面内容
    print("---no matter has error or not,this willpart all")
print('--do sth else---')

7、制作自己的异常

class DayiError(Exception):
    def __init__(self, msg):
        self.message = msg
    # def __str__(self):
    #    return 'sdfsf'
try:
    raise DayiError('数据库连不上')
except DayiError as e:
    print(e)