Python 异常处理

当检测到⼀个错误时,解释器就⽆法继续执⾏了,反⽽出现了⼀些错误的提示,这就是所谓的"异常"。

  • 异常即是一个事件,该事件在程序执行过程中发生,会影响程序的正常执行。
  • 异常是Python对象,表示一个错误。一般情况下,在Python无法正常处理程序时就会发生一个异常。
  • 当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。

异常处理

常见的异常和描述

异常名称描述
StopIteration 迭代器没有更多的值
ZeroDivisionError 除(或取模)零 (所有数据类型)
AttributeError 对象没有这个属性
OSError 操作系统错误
ImportError 导入模块/对象失败
IndexError 序列中没有此索引(index)
KeyError 没有这个键
NameError 未声明/初始化对象 (没有属性)
SyntaxError Python 语法错误
TypeError 对类型无效的操作
ValueError 传入无效的参数
   
Warning 警告的基类

要处理异常,先要捕获异常。

Python 中使用 try...except...来捕获和处理异常。

  • Python会检测 try 中的代码块,如果有异常,会跳转到匹配该异常的 except 语句,并把异常对象交给except处理,处理完后,程序继续执行;
  • 如果没有匹配对应异常except语句,程序还是会终止,无法继续执行。

需要注意的是,语法错误SyntaxError无法被捕获处理。

(1)try...except...

try:
    可能发送异常的语句
except:
    处理异常的语句

示例1:

try:
    print(a)
except NameError as e:  # except 异常 as 别名  如果直接写except:则表示捕获所有异常
    print(e)    # name 'a' is not defined

try:
    print('a' + 1)      # TypeError: can only concatenate str (not "int") to str
except NameError as e:  # 由于try中的语句抛出的是TypeError异常,这里匹配的是NameError异常,没有匹配上,因此上述代码还是抛出异常
    print(e)

示例2:

try:
    print('a' + 1)      #
except NameError as e:  # try中语句抛出的是TypeError异常,不匹配,该except中的代码不会执行
    print(e)
    print('捕获到 NameError')
except TypeError as e:  # 匹配到异常,执行该except中的代码
    print(e)                    # can only concatenate str (not "int") to str
    print('捕获到 TypeError')    # 捕获到 TypeError

 

(2)异常处理的else

try...except...else...

else 表示的是如果没有异常要执⾏的代码。

try:
    可能发生异常的代码
except:
    捕获到异常后要执行的代码
else:
    没有发生异常会执行的代码
try:
    print(1 + 1)      #
except:         #  匹配所有异常,也就是说只要发生了异常就会执行该except中的代码
    print('捕获到异常')    # 没有发生异常,该代码不会执行
else:           # try中语句正常执行完未发生异常,因此会执行else中的语句
    print('未发生异常')    # 未发生异常  

(3)异常处理的finally

类似else,但finally中的语句无论是否发送异常,无论异常是否被捕获到,都会执行。

try:
    可能发送异常的代码
except 异常:
    捕获异常要执行的代码
finally:
    是否发生异常,异常是否被捕获,最终都会执行的代码
try:
    print(1 + a)      #
except TypeError:         #  未匹配到异常
    print('捕获到异常')    # 虽然发生了异常,但并未捕获到,不会执行
else:           # try中语句发生异常,else中的代码不会执行
    print('未发生异常')    
finally:
    print('我一定会被执行')    # 我一定会被执行  虽然发生了异常并未被捕获到,但本行代码还是会执行
try:
    print(1 + 1)      # 2
except TypeError:         #  
    print('捕获到异常')    # 没有发生异常,该代码不会执行
else:           # try中语句正常执行,else中的代码会执行
    print('未发生异常')  # 未发生异常
finally:
    print('我一定会被执行')    # 我一定会被执行

(4)自定义异常

如果觉得内置的异常类型不能满足需求,可以自定义异常类。

自定义异常类必须继承Exception类。使用 raise 异常类 来抛出异常

class MyException(Exception):
    def __init__(self, info):
        self.info = info

    def __str__(self):
        return f'{self.info}'


def func1():
    a = input('请输入整数:')
    if a.isdigit():
        print('%s的平方是:%s' % (a, int(a) ** 2))
    else:
        raise MyException(f'【{a}】不是整数')  # raise 异常类对象 表示抛出异常

try:
    func1()     # 执行func1(),输入 abc
except MyException as e:
    print(e)    # 打印出自定义异常信息【aa】不是整数
else:
    print('没捕捉到自定义的异常')

为了更好的处理异常,自定义异常类一般要实现__init__() 和__str__()这2个魔术方法。

 

posted on 2023-04-08 18:37  木去  阅读(138)  评论(0)    收藏  举报