Python干货——异常处理

116 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的21天,点击查看活动详情

👨‍🎓作者:Java学术趴

🏦仓库:GithubGitee

✏️博客:CSDN掘金InfoQ云+社区

💌公众号:Java学术趴

🚫特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系小编授权。

🙏版权声明:文章里的部分文字或者图片来自于互联网以及百度百科,如有侵权请尽快联系小编。微信搜索公众号Java学术趴联系小编。

☠️每日毒鸡汤:这个社会是存在不公平的,不要抱怨,因为没有用!人总是在反省中进步的!

👋大家好!我是你们的老朋友Java学术趴。在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息直接显示给用户,而是更友好的给出一个提示的页面,通俗来说就是不让用户不知所措,使得报错更友好、更清晰。

第十九章 异常处理

19.1 内置的异常处理

19.1.1 异常的概念

异常的概念:

有时候写代码写错了,执行程序的时候,执行到错误代码的时候,程序直接终止报错,这是因为Python检测到了一个错误时,解析器就无法继续执行了,出了错误的提示,这就是“异常”

语法格式

Python中异常

19.1.2 try...except 语句

  • 将可能出错的代码放到try里面,except可以指定类型捕获异常。except里面的代码是捕获到异常时执行,将错误捕获,这样程序不会因为异常的而代码导致整个程序崩塌。
  • Exception : 当我们不知道程序会抛出什么异常的时候,就使用 Exception,它包含所有的异常
  • 只有当被监控的代码出现异常的时候,才会执行 except 中处理异常的代码块

except : 当try中的代码发生异常的时候执行这个except代码块


# 异常处理
# try中存储可能发生异常的代码块
try:
    print(b)
    print(1/0)
    pass# except中用于打印报错信息
# NameError : 代表的是错误的类型(未定义参数),需用使用特定的错误类型来接收错误信息,否则报错
except NameError as msg:
    print(msg)
    pass# 可以一次定义多个 except 模块,分别用于处理不同的错误类型。
# Python会根据报错信息不同,执行不同的except代码块
except ZeroDivisionError as msg:
    print(msg)
    pass
# 在Python中存在一个异常的集合父类,这个 Exception 可以接收任意类型的异常
except Exception as msg:
    print(msg)
    pass
  
# 此时程序不会被终止运行,会打印错误信息:name 'b' is not defined或者division by zero

19.1.3 try...except...else 语句

当try中的代码块没有发生异常时候执行 else 代码块


# 异常处理
# try中存储可能发生异常的代码块
def show(a):
    try:
        print(10 / a)
        pass
​
    except ZeroDivisionError as msg:
        print(msg)
        pass
​
    # 当 try 中的代码没有异常的时候执行else中代码块
    else:
        print('此时代码没有发生异常')
​
    pass
​
​
show(10)
# 1.0
# 此时结果为0,此时代码没有发生异常,执行的else代码块中的逻辑

19.1.4 try...except...else...finally 语句

不论 try 中的代码是否抛出异常,都会执行 finally 代码块


# 异常处理
# try中存储可能发生异常的代码块
def show(a):
    try:
        print(10 / a)
        pass
​
    # 当try中的代码发生异常的时候执行 except 代码块
    except ZeroDivisionError as msg:
        print(msg)
        pass
​
    # 当 try 中的代码没有异常的时候执行else中代码块
    else:
        print('此时代码没有发生异常')
        pass
​
    # 不论 try 代码块有没有异常都会执行 finally 代码块
    finally:
        print('释放资源')
        pass
​
    pass
​
​
show(10)
# 1.0
# 此时结果为0,此时代码没有发生异常,执行的else代码块中的逻辑
# 也会执行 finally代码块,不论有没有异常 释放资源

19.2 自定义异常

实现方式:

  • 自定义异常,都要直接或者间接继承Error或Exception类
  • 由开发者主动抛出自定义异常,在Python中使用raise关键字
  • 这个 raise关键字和Java中的throw关键子一样,都是用于抛出一个异常的

Python内置的异常是由Python自己抛出的,而自定义的异常需要使用 raise 关键字手动抛出


# 自定义异常类,必须直接或者间接的继承 Exception 类
class TooLong(Exception):
​
    def __init__(self, name):
        self.name = name
        pass
​
    # 定义错误信息
    def __str__(self):
        return '您输入姓名的长度为:' + str(len(self.name)) + '超出了姓名长度'
​
    pass
​
​
def get_name():
    name = input('请输入姓名:')
    # 判断姓名的长度
    try:
        if len(name) > 5:
            # 此时使用 raise 关键字抛出一个自定义的异常
            raise TooLong(name)
        else:
            print(name)
        pass
​
    except TooLong as msg:
        print(msg)
        pass
​
    else:
        print('代码没有异常')
        pass
​
    finally:
        print('释放资源')
        pass
    pass# 调用方法
get_name()

\