Python_9:异常处理

异常处理

一、基础知识

1.1 什么异常

异常指的是软件在运行的过程中,因为一些原因(如:使用者操作不当等),引起程序错误,导致软件奔溃的这种现象

1.2 为什么要处理异常

提高软件容错性。代码就能够继续向后执行,而不会奔溃。

二、异常处理

2.1 常见的异常

  • ValueError
  • KeyError
  • KeyboardInterrupt
  • ArithmeticError
  • FloatingPointError
  • IndexError
  • SyntaxError

2.2 异常的继承关系

BaseException 所有异常的超类
Exception(BaseException) 常规错误的异常超类
ValueError、KeyError、KeyboardInterrupt、ArithmeticError…等常见类均继承Exception类

2.3 异常处理

2.3.1 try…except语句

try……except语句:将可能出现异常的代码段放在try语句块,遇到异常程序不终止报错,跳转到except语句块中。

try:
	# 将有可能触发异常的代码
			
except:
	print("处理异常")
  • 简单应用:处理通用异常
# 如果代码中可能会出现异常,可以使用try来尝试着抓捕异常
try:
    # 将有可能触发异常的代码写下try中
    num = int(input("请输入一个数字:"))
    result = num + 10

except:     #当出现异常时,跳转此处
    print("出现异常!")

"""
结果:
请输入一个数字:s		#s不是整型
出现异常!
"""
  • 可以通过指定异常类构建对象,输出异常信息:
# 如果代码中可能会出现异常,可以使用try来尝试着抓捕异常
try:
    # 将有可能触发异常的代码写下try中
    num = int(input("请输入一个数字:"))
    result = num + 10

except Exception as e:     #当出现异常时,跳转此处
    print("出现异常!异常信息是:", e)
    
"""
结果:
请输入一个数字:w
出现异常!异常信息是: invalid literal for int() with base 10: 'w'
"""

2.3.2 多个异常的处理

#方法一:
try:
	pass

except KeyboardInterrupt:
	pass
except BlockingIOError:
	pass
except EOFError:
	pass
except Exception:
	pass

#方法二(不推荐使用)
try:
	pass
except (KeyboardInterrupt, KeyError, ValueError, EnvironmentError) as e:
	print("出现了异常")

实例:

# 如果代码中可能会出现异常,可以使用try来尝试着抓捕异常
try:
    # 将有可能触发异常的代码写下try中
    num = int(input("请输入一个数字:"))
    result = num + 10
    f = open("a.txt", "rt")

except ValueError as e:
    print("出现异常!", e)

except FileExistsError:
    print("出现异常!文件不存在")

"""
结果:
请输入一个数字:w
出现异常! invalid literal for int() with base 10: 'w'
————————————————————————————————————
请输入一个数字:15
出现异常!文件不存在
"""
  • 可以使用多态性,将其他可能出现的异常处理掉
# 如果代码中可能会出现异常,可以使用try来尝试着抓捕异常
try:
    # 将有可能触发异常的代码写下try中
    num = int(input("请输入一个数字:"))
    result = num + 10
    # f = open("a.txt", "rt")
    sasas

except ValueError:
    print("出现数值型异常!")

except FileNotFoundError:
    print("出现异常!文件不存在")

except BaseException as e:
    print("出现其他异常,异常信息是:", e)
    
"""
结果:
请输入一个数字:1
出现其他异常,异常信息是: name 'sasas' is not defined
"""

2.3.3 else

try:
    # 将有可能触发异常的代码写下try中
    num = int(input("请输入一个数字:"))
    result = num + 10
    # f = open("a.txt", "rt")

except ValueError:
    print("出现数值型异常!")

except FileNotFoundError:
    print("出现异常!文件不存在")

except BaseException as e:
    print("出现其他异常,异常信息是:", e)

else:
    # try语句块中没有任何异常,执行此语句块
    print("没有异常!")
    
"""
结果:
请输入一个数字:12
没有异常!
"""

2.3.4 finally关键字

不论有没有异常,finally语句块都要执行。

一般会将必须要执行的代码,如资源的释放,链接的是关闭等等放入finally语句块

try:
    int(input("请输入一个数:"))

except Exception as e:
    print("出现了异常")
else:
    print("没有出现异常")
finally:
    print("不管出不出现异常,我都要执行")
    # 一般会将必须要执行的代码,如资源的释放,链接的是关闭等等


print("剩余的代码")

"""
结果: 
请输入一个数:1
没有出现异常
不管出不出现异常,我都要执行
剩余的代码
————————————————
请输入一个数:w
出现了异常
不管出不出现异常,我都要执行
剩余的代码
"""
  • 函数中:如果在return后面存在finally,那么代码并不会直接返回,而是需要先执行finally代码,之后才会返回
#对比1
def demo(msg):
    try:
        int(msg)
        return "a"
    except Exception as e:
        print("处理异常")
        return "b"
    finally:
        print("释放资源")
        return "C"		

    return "D"


res = demo(input(">>>:"))
print(res)

"""
结果:
>>>:1
释放资源
C
————————————————————
>>>:w
处理异常
释放资源
C
"""
#对比2
def demo(msg):
    try:
        int(msg)
        return "a"
    except Exception as e:
        print("处理异常")
        return "b"
    finally:
        print("释放资源")
        # return "C"		

    return "D"


res = demo(input(">>>:"))
print(res)

"""
结果:
>>>:1
释放资源
a
————————
>>>:w
处理异常
释放资源
b
"""

三、自定义异常

  1. 首先需要定义一个类,之后让这个类继承Exception\BaseException,建议使用Exception类。
  2. 人为的抛出异常:raise关键字。作用:提示错误,向上层传递错误信息
class MyException(Exception):

    def __init__(self, msg):
        Exception.__init__(self, msg)


def login(username, password):

    if username is None or username.strip() == "":
        # 抛出异常,使用raise关键字抛出异常
        # 认为的抛出异常,1、这儿出了错, 2、向调用者传递信息
        raise MyException("对不起,用户名称不能为空")

    if password is None or password.strip() == "":
        raise Exception("对不起,用户密码不能为空")

    print("登录成功")


if __name__ == '__main__':
    try:
        login(input(">>"), input(">>"))
    except Exception as e:
        print("抓捕到异常,信息是--->", e)
  
"""
结果:
>>
>>1
抓捕到异常,信息是---> 对不起,用户名称不能为空
————————————————————
>>1
>>
抓捕到异常,信息是---> 对不起,用户密码不能为空
"""
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值