三十分钟带你玩转Python异常处理

什么是异常?

异常即一个事件,该事件会在程序运行中执行,如果程序遇到异常而没有及时捕获该异常程序就会抛出错误,也就是报错。

而异常处理可以让我们的代码更加的健壮,简单说就是:异常是错误出现时,可以在正常的控制流程以外采取的行为。

try-except 语句

语法

try:
	执行正常代码
except[异常类型可选]:
	执行异常代码

异常示例

num = int(input('Please enter a number:'))
if num < 18:
    print("I'm sorry, you're underage!")
else:
    print("Congratulations, you've come of age!")

对于这个程序而已,如果输入一个非整数数字那将会抛出字符无效的异常,假设输入abc将会得到以下异常;

异常信息: ValueError: invalid literal for int() with base 10: ‘aba’

ValueError:异常类型,Python有很多内置的异常类可在标准库中查找;

异常处理

下面我们改善一下它,让它变得更加的健壮!

# 一 不打印报错信息
"""
try:
    num = int(input('Please enter a number:'))
    if num < 18:
        print("I'm sorry, you're underage!")
    else:
        print("Congratulations, you've come of age!")
except:
	# 程序发送异常时执行
    print("Please input properly!")
"""

# 二 打印异常信息
# 注意,这里我添加了异常检测类型
# 如果程序比较复杂推荐打印异常信息,然后写入日志。
try:
    num = int(input('Please enter a number:'))
    if num < 18:
        print("I'm sorry, you're underage!")
    else:
        print("Congratulations, you've come of age!")
except ValueError as error:
    # 程序发送异常时执行
    print('异常信息:', error)

try-except-else 语句

你可以注意到了就是 try-except 多加了一个 else ,不错不过这个 else 大有用处!

语法

try:
    执行正常代码(检测与捕获)
except:
	执行异常代码
else:
	执行正常代码(无异常正常处理)

示例

try:
    num = int(input('Please enter a number:'))
except ValueError as error:
    print('异常信息:', error)
else:
    if num < 18:
        print("I'm sorry, you're underage!")
    else:
        print("Congratulations, you've come of age!")

这样做的好处是只需要检测会出现异常的代码块,减少代码的冗余,让程序的可读性更佳!

try-except-finally 语句

语法

try:
	执行正常代码
except[异常类型可选]:
    执行异常代码
finally:
	不管是不是异常都会执行

示例

try:
    file = open('new.txt', 'w')
    content = 'Hello, Python'
    file.write(content)
except:
    print('在进行文件操作时,遇到了异常!')
finally:
    file.close()

这里我打开了一个文件,并往里面写入内容,但当程序出现异常时我希望把打开的文件释放掉这时可以用 finally 。

处理多个异常

废话少说,直接上代码

try:
    age = int(input('请输入你的年龄:'))
    x = 10 / age
    print(x)
# 如果捕获了该异常,则边的异常不再捕获
except ValueError:
    print('别闹, 快输入整数!')
#0 是不能被作为除数的,所以我们也需要捕获该异常
except ZeroDivisionError:
    print('请输入合理的年龄!')

简化型

try:
    age = int(input('请输入你的年龄:'))
    x = 10 / age
    print(x)
# 多个异常类型捕获需使用元组将其包括
except (ValueError, ZeroDivisionError):
    print('请输入一个合理的年龄!')

raise 主动抛出异常

示例

age = int(input('请输入一个年龄:'))
if age < 18:
    raise ValueError('你还没成年!')
print('Continue')

注意: 主动抛出异常语句慎用

自定义异常

# 自定义异常
class ValidateError(ValueError):
    def __init__(self, userdata):
        super().__init__(userdata)

# 登录验证
def login(user, password):
    if user == '' or password == '':
        raise ValidateError('账号密码不能为空!')
    if user != 'andy' or password != '123456':
        raise ValidateError('账号密码不正确!')


user = input('请输入你的用户名:')
password = input('请输入你的密码:')
try:
    login(user, password)
except ValidateError as e:
    print(e)
else:
    print('登录成功!')

当标签库里的异常类不能给精准的捕获我们所需的异常时,我们可以自定义一个!

猜你喜欢

转载自blog.csdn.net/m0_59485658/article/details/126937411