异常处理

异常处理

错误分类

语法错误

if 2 > 1
    print(222)
# 未加冒号

dic = {"name"; "alex"}
# 字典中用冒号分隔键和值

tu = (2,3,4!5)
# 元组中用逗号相隔

逻辑错误

num = int(input("请输入数字"))
# 输入数字以外的内容,无法整型化,报错

dic = {"name": "海狗", "age": 18}
dic["hobby"]
# dic字典中没有["hobby"], 找不到报错

try except

try:
    num = int(input('>>>'))
    print(111)
except ValueError:
    print(666)
# input输入字符串类型的数字时, 输出111
# input输入字符串类型的非数字时, 输出666

try:
    dic = {'name': '嘉欣'}
    print(dic['age'])          # 出现KeyError时 直接跳转except
    num = int(input('>>>'))
    print(111)
except KeyError:
    print(555)

结构分类

结构1 单分支

try:
    num = int(input(">>>"))        # 出现ValueError错误时, 直接跳转except
    dic = {"name": "嘉欣"}
    print(dic["age"])
    print(111)
except ValueError:
    print(666)

结构2 多分支

try:
    num = int(input(">>>"))
    dic = {"name": "嘉欣"}
    print(dic['age'])
    l1 = [1,2]
    print(l1[100])
    print(111)
except ValueError:
    print("输入的有非数字元素")
except KeyError:
    print("没有此键")
except IndexError:
    print("没有此下标")
print(666)

结构3 万能异常处理 处理所有python可以识别的异常

try:
    dic = {"name": "嘉欣"}
    print(dic["age"])
    l1 = [1,2]
    print(l1[100])
    print(111)
    for i in 123:
        pass
except Exception:
    print(666)
# 有异常直接跳转except
    
try:
    dic = {"name": "嘉欣"}
    # print(dic["age"])
    l1 = [1,2]
    # print(l1[100])
    print(111)
    for i in 123:
        pass
except Exception as e:
    print(e)
# 捕捉异常并打印出异常原因

tips

什么时候用万能? 什么时候用多分支?

如果你对错误信息不关心, 只是想排除信息继续让程序走下去, 用万能异常.

你对错误信息要进行明确的分流, 让你的程序多元化开发.

例如:
def func():
    pass

def func1():
    pass

dic = {1: func,
       2: func1}

try:
    num = int(input("请输入序号"))
    dic[num]()
except ValueError:
    print("请输入数字")
except KeyError:
    print("请输入范围内数字")

结构4 多分支 + 万能异常处理

def func():
    pass

def func1():
    pass

dic = {1: func,
       2: func1}
try:
    num = int(input("请输入序号"))
    dic[num]()
except ValueError:
    print("请输入数字")
except KeyError:
    print("请输入范围内数字")
except Exception:
    print("程序出现了意料之外的错误...")

结构5 try else finally

try:
    dic = {"name": "嘉欣"}
    print(dic["age"])
    l1 = [1, 2]
    print(l1[100])
    print(111)
except KeyError:
    print("没有此键")
except IndexError:
    print("没有此下标")
else:
    print("如果没有出现异常则执行这里")
finally:
    print("finally 666")
    
# except 必须依赖于try, else必须依赖于except和try
# finally只是依赖于try
# finally : 在异常出现之前, 执行finally
try:
    dic = {"name": "嘉欣"}
    print(dic["age"])
    l1 = [1,2]
    print(l1[100])
except KeyError:
    print("没有此键")
except IndexError:
    print("没有此下标")
except Exception:
    pass
print(111)
finally:
    print("finally 666")

# finally 关闭数据库连接, 文件句柄关闭,数据保存等时,用到finally


# 在return 结束函数之前, 执行finally代码
def func():
    try:
        print(111)
        return 666
    finally:
        print(222)
print(func())
"""
111
222
666
"""

结构6 主动触发异常

raise ValueError("出现了value错误")

结构7 断言:展现出一种强硬的态度.

assert 条件
name = "alex"
n1 = input("请输入:")
assert name == n1
print(111)
print(222)

结构8 自定义异常

# python 中给你提供的错误类型很多,但是不是全部的错误

class LiYeError(BaseException):
    def __init__(self, msg):
        self.msg = msg
    def __str__(self):
        return self.msg
    
try:
    # 报错代码(万能异常处理无法识别)
    raise LiYeError("socket.connent...")
except LiYeError as e:
    print(e)
原文地址:https://www.cnblogs.com/beichen123/p/11342254.html