10-Python-异常捕获

目录

1. 错误和异常

   1.1 错误

   1.2 异常

2. 处理异常

   2.1 try...except

   2.2 except捕获多个异常

   2.3 捕获所有异常

   2.4 获取异常信息

   2.5 else 子句

   2.6  finally 子句


1. 错误和异常

   1.1 错误

  • 通常是使用不正确的语法造成的
# -*- coding: utf-8 -*-
# @Time    : 2021/2/9
# @Author  : 大海


# SyntaxError: invalid syntax
# if 后面缺少冒号(:)
a  = 1
if a==1
    print(a)

   1.2 异常

  • 当Python检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的"异常"
# -*- coding: utf-8 -*-
# @Time    : 2021/2/9
# @Author  : 大海

# ZeroDivisionError: division by zero
a = 10 / 0
print(a)


# TypeError: can only concatenate str (not "int") to str
b = '2' + 2
print(b)

2. 处理异常

   2.1 try...except

  • 把可能出现问题的代码,放在try中
  • 把处理异常的代码,放在except中

try 语句的工作原理如下:

  • 首先,执行 try 子句 (try 和 except 关键字之间的(多行)语句)。
  • 如果没有异常发生,则跳过 except 子句 并完成 try 语句的执行。
  • 如果在执行 try 子句时发生了异常,则跳过该子句中剩下的部分。 然后,如果异常的类型和 except 关键字后面的异常匹配,则执行 except 子句,然后继续执行 try 语句之后的代码。
  • 如果发生的异常和 except 子句中指定的异常不匹配,则将其传递到外部的 try 语句中;如果没有找到处理程序,则它是一个 未处理异常,执行将停止并显示如下所示的消息。
# -*- coding: utf-8 -*-
# @Time    : 2021/2/9
# @Author  : 大海

try:
    print('-----test--1---')
    open('123.txt', 'r')
    print('-----test--2---')
except IOError:
    print('这是发生异常后处理的代码!')

   2.2 except捕获多个异常

  • 使用:把要捕获的异常的名字,放到except 后,并使用元组的方式仅进行存储
# -*- coding: utf-8 -*-
# @Time    : 2021/2/9
# @Author  : 大海

try:
    print('-----test--1---')
    open('123.txt', 'r')  # 如果123.txt文件不存在,那么会产生 IOError 异常
    print('-----test--2---')
    print(num)  # 如果num变量没有定义,那么会产生 NameError 异常

except (IOError, NameError):
    print('这是发生异常后处理的代码!')
  • 注:如果发生的异常和 except 子句中的类是同一个类或者是它的基类,则异常和 except 子句中的类是兼容的(但反过来则不成立 --- 列出派生类的 except 子句与基类不兼容)
# -*- coding: utf-8 -*-
# @Time    : 2021/2/9
# @Author  : 大海

class B(Exception):
    pass


class C(B):
    pass


class D(C):
    pass


# 下面的代码将依次打印 B, B, B
for cls in [B, C, D]:
    try:
        raise cls()
    except B:
        print("B")
    except C:
        print("C")
    except D:
        print("D")

# 下面的代码将依次打印 B, C, D
for cls in [B, C, D]:
    try:
        raise cls()
    except D:
        print("D")
    except C:
        print("C")
    except B:
        print("B")

   2.3 捕获所有异常

# -*- coding: utf-8 -*-
# @Time    : 2021/2/9
# @Author  : 大海

try:

    print(num)  # 如果num变量没有定义,那么会产生 NameError 异常

except Exception:
    print('这是发生异常后处理的代码!')

   2.4 获取异常信息

  • 注:谨慎使用,因为以这种方式很容易掩盖真正的编程错误!它还可用于打印错误消息,然后重新引发异常
# -*- coding: utf-8 -*-
# @Time    : 2021/2/9
# @Author  : 大海

try:

    print(num)  # 如果num变量没有定义,那么会产生 NameError 异常

except NameError as e:
    print('这是发生异常后处理的代码!')
    print(e)  # 打印异常信息

   2.5 else 子句

  • 未发生异常时,执行else子句
# -*- coding: utf-8 -*-
# @Time    : 2021/2/9
# @Author  : 大海


try:
    num = 100
    print(num)
except NameError as e:
    print('产生错误了:%s' % e)
else:
    print('未发生异常时的逻辑代码')

   2.6  finally 子句

  • 不论 try 语句是否产生了异常都会被执行

4种特殊情况:

  • 如果在执行 try 子句期间发生了异常,该异常可由一个 except 子句进行处理。 如果异常没有被某个 except 子句所处理,则该异常会在 finally 子句执行之后被重新引发。
  • 异常也可能在 except 或 else 子句执行期间发生。 同样地,该异常会在 finally 子句执行之后被重新引发。
  • 如果在执行 try 语句时遇到一个 breakcontinue 或 return 语句,则 finally 子句将在执行 breakcontinue 或 return 语句之前被执行。
  • 如果 finally 子句中包含一个 return 语句,则返回值将来自 finally 子句的某个 return 语句的返回值,而非来自 try 子句的 return 语句的返回值。
# -*- coding: utf-8 -*-
# @Time    : 2021/2/9
# @Author  : 大海


def divide(x, y):
    try:
        result = x / y

    except ZeroDivisionError:
        print("division by zero!")
    else:
        print("result is", result)
    finally:
        print("executing finally clause")


divide(2, 1)
divide(2, 0)

divide("2", "1")

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱学习de测试小白

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值