9.异常处理

九、异常处理

 

需求:当程序遇到问题不让程序结束,而越过错误继续向下执行

try……except……else
格式:
try:
    语句t
except 错误码 as e:
    语句1
except 错误码 as e:
    语句2
    ……
    ……
else:
    语句f
注意:else语句可有可无

作用:用来检测try语句块中的错误,从而让except语句捕获错误信息并处理
逻辑:
1、如果try:“语句t”执行出现错误,会匹配第一个错误码,如果
匹配上就执行对应“语句”
2、如果当try“语句t”执行没有错误,没有匹配的异常,错误将会
匹配上一层的try“语句”,或者到程序的最上层
3、如果当try"语句t"执行没有出现错误,执行else下的“语句”(你得有)

try:
    print(3 / 0)
except ZeroDivisionError as e:
    print("除数为0了")
else:
    print("*")
print("*****")


try:
    print(4 / 0)
    print(nums)
except:
    print("程序出现异常")

#使用except带着多种异常
try:
    pass
    print(4 / 0)
    print(nums)
except(ZeroDivisionError, NameError ):
    print("出现了NameError,ZeroDivisionError")

特殊
1、错误其实是class(类),所有的错误都是继承自BaseException,所以在捕获的时候,他捕获了该类型的错误,还把子类一网打尽
try:
    print(5 / 0)
except BaseException as e:
    print("异常1")
except ZeroDivisionError as e:
    print("异常2")

#2、跨越多层调用,main()调用了func1
def func1(num):
    print(1 / num)
def func2(num):
    func1(num)
def main():
    func2(0)
try:
    main()
except ZeroDivisionError as e:
    print("******")

try ……except……finally
格式:
try:
    语句t
except 错误码 as e:
    语句1
except 错误码 as e:
    语句2
    ……
    ……
finally:
    语句f

作用:语句t无论是否有错误都执行最后的语句f
try:
    print(1/0)
except ZeroDivisionError as e:
    print("******")
finally:
    print("必须执行我")

# 断言
def func(num, div):
    assert (div != 0),"""div不能为0"""
    return num / div
print(func(10, 0))

 9-1  捕获异常

# 捕获简单异常

try:
    print("-"*20)
    first_number = input("输入第一个数:")
    second_number = input("输入第二个数:")
    print(int(first_number) / int(second_number))
    print("-"*20)
except ZeroDivisionError:
    print("第二个数不能为0")

9-2  捕获多个异常

# 捕获简单异常

try:
    print("-"*20)
    first_number = input("输入第一个数:")
    second_number = input("输入第二个数:")
    print(int(first_number) / int(second_number))
    print("-"*20)
    
except ZeroDivisionError:
    print("第二个数不能为0")

except ValueError:
    print("只能输入数字")

    
try:
    print("-"*20)
    first_number = input("输入第一个数:")
    second_number = input("输入第二个数:")
    print(int(first_number) / int(second_number))
    print("-"*20)

#   捕获多个异常,用同一种处理方法
except (ZeroDivisionError, ValueError):
    print("第二个数不能为0")
    print("只能输入数字")



    

9-3  捕获异常的描述信息

try:
    print("-"*20)
    first_number = input("输入第一个数:")
    second_number = input("输入第二个数:")
    print(int(first_number) / int(second_number))
    print("-"*20)

#   捕获异常的描述信息
except (ZeroDivisionError, ValueError) as result:
    print("捕获到异常:%s"%(result))

    

9-4  捕获所有异常

try:
    print("-"*20)
    first_number = input("输入第一个数:")
    second_number = input("输入第二个数:")
    print(int(first_number) / int(second_number))
    print("-"*20)

#   捕获到所有异常,都执行同样的处理
except :
    print("捕获到异常")

    
try:
    print("-"*20)
    first_number = input("输入第一个数:")
    second_number = input("输入第二个数:")
    print(int(first_number) / int(second_number))
    print("-"*20)

#   捕获到所有异常,输出异常类型
except Exception as result:
    print("捕获到异常:%s"%(result))

    

9-7  没有捕获到异常,执行else语句

try:
    print("-"*20)
    first_number = input("输入第一个数:")
    second_number = input("输入第二个数:")
    print(int(first_number) / int(second_number))
    print("-"*20)

#   捕获到所有异常,输出异常类型
except Exception as result:
    print("捕获到异常:%s"%(result))

#   没有捕获到异常时,执行else语句
else:
    print("程序正常运行,没有捕获到异常。")

    

9-8  终止行为:无论有没有异常都要执行的语句

import time
try:
    file = open("test.txt", "w+")
    while True:
        content = file.read()
        if len(content) == 0:
            break;
        time.sleep()
        print(content)
        
#   始终要执行的语句
finally:
    file.close()
    print("关闭文件")

9-10  自定义异常

class ShortInputException(Exception):
    #   自定义异常类
    def __init__(self, length, atleast):
        self.length = length  # 输入长度
        self.atleast = atleast  # 至少长度
try:
    text = input("输入密码:")
    if len(text) < 3:
        # raise 引发一个刚刚定义的异常
        raise ShortInputException(len(text), 3)
except EOFError:
    print("您输入了一个结束标识符")
except ShortInputException as result:
    print("ShortInputException:输入的长度是%d,长度至少是%d"
          %(result.lenth, result.atleast))
else:
    print("没有异常发生。")
原文地址:https://www.cnblogs.com/xieyi-newlife/p/8923996.html