21 天 Python 计划:异常处理全解析

前言

Python是一种强大且易于学习的编程语言。通过这个21天的计划,我们将逐步深入异常处理。无论你是初学者还是有一定基础的开发者,这个计划都将帮助你巩固和扩展你的Python知识。

在学习本篇之前,我们先复习一下前面的内容:
day1:Python下载和开发工具介绍
day2:数据类型、字符编码、文件处理
day3:基础语法与课外练习
day4:函数简单介绍
day5:模块与包
day6:常用模块介绍
day7:面向对象
day8:面向对象高级

一、什么是异常

在程序运行过程中,当出现错误时会产生一种信号,这种信号被称为异常。若程序中没有对该异常进行处理,它就会被抛出,进而导致程序运行终止。在Python 里,错误触发的异常情况如下。

错误主要分为以下两种:

  1. 语法错误:这类错误无法通过 Python 解释器的语法检测,必须在程序执行前就进行改正。
  2. 逻辑错误:程序在语法上没有问题,但由于逻辑设计不当而导致的错误。

二、异常的种类

在 Python 中,不同的异常可以用不同的类型来标识(Python 统一了类与类型,类型即类),每种异常标识一种特定的错误。

1、常见异常示例

  • AttributeError:试图访问一个对象不存在的属性,例如 foo.x,但 foo没有属性 x。
  • IOError:输入/输出异常,通常是无法打开文件。
  • ImportError:无法引入模块或包,大多是路径问题或名称错误。
  • IndentationError:语法错误的子类,代码没有正确对齐。
  • IndexError:下标索引超出序列边界,比如当 x 只有三个元素,却试图访问 x[5]。
  • KeyError:试图访问字典里不存在的键。
  • KeyboardInterrupt:按下 Ctrl + C 触发。
  • NameError:使用一个还未被赋值的变量。
  • SyntaxError:Python 代码非法,代码不能编译(本质上属于语法错误)。
  • TypeError:传入对象的类型与要求的不符合。
  • UnboundLocalError:试图访问一个还未被设置的局部变量,通常是因为存在同名的全局变量,导致误解。
  • ValueError:传入一个调用者不期望的值,即使值的类型是正确的。

2、完整异常列表

ArithmeticError
AssertionError
AttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EnvironmentError
EOFError
Exception
FloatingPointError
FutureWarning
GeneratorExit
ImportError
ImportWarning
IndentationError
IndexError
IOError
KeyboardInterrupt
KeyError
LookupError
MemoryError
NameError
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError

三、异常处理

为了增强程序的健壮性和容错性,确保程序在遇到错误时不会崩溃,我们需要对异常进行处理。

1、可预知错误的处理

如果错误发生的条件是可以预知的,我们可以使用 if 语句在错误发生之前进行预防。

AGE = 10
while True:
    age = input('>>: ').strip()
    if age.isdigit():  # 只有在 age 为字符串形式的整数时,下列代码才不会出错,该条件是可预知的
        age = int(age)
        if age == AGE:
            print('you got it')
            break

在这里插入图片描述

2、不可预知错误的处理

如果错误发生的条件不可预知,则需要使用 try…except语句在错误发生之后进行处理。

基本语法
try:
    被检测的代码块
except 异常类型:
    try 中一旦检测到异常,就执行这个位置的逻辑
示例
try:
    f = open('a.txt')
    g = (line.strip() for line in f)
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
except StopIteration:
    f.close()

在这里插入图片描述

3、异常处理的多种情况

  1. 异常类只能处理指定异常:异常类只能处理指定的异常情况,如果是非指定异常则无法处理。
s1 = 'hello'
try:
    int(s1)
except IndexError as e:  # 未捕获到异常,程序直接报错
    print(e)

在这里插入图片描述

  1. 多分支异常处理:可以使用多个 except语句处理不同类型的异常。
s1 = 'hello'
try:
    int(s1)
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print(e)

在这里插入图片描述

  1. 万能异常 Exception:使用 Exception可以捕获所有异常。
s1 = 'hello'
try:
    int(s1)
except Exception as e:
    print(e)

在这里插入图片描述

  1. 多分支异常与万能异常结合
    • 如果希望无论出现什么异常,都统一处理,使用一个 Exception即可。
    • 如果需要对不同的异常定制不同的处理逻辑,则使用多分支。
  2. 多分支后加 Exception:在多分支异常处理后添加 Exception,可以捕获前面未处理的异常。
s1 = 'hello'
try:
    int(s1)
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print(e)
except Exception as e:
    print(e)

在这里插入图片描述

  1. 异常的其他结构:else语句在 try内代码块没有异常时执行,finally语句无论异常与否都会执行,通常用于清理工作。
s1 = 'hello'
try:
    int(s1)
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print(e)
# except Exception as e:
#     print(e)
else:
    print('try 内代码块没有异常则执行我')
finally:
    print('无论异常与否,都会执行该模块,通常是进行清理工作')

在这里插入图片描述

  1. 主动触发异常:使用 raise语句主动触发异常。
try:
    raise TypeError('类型错误')
except Exception as e:
    print(e)

在这里插入图片描述

  1. 自定义异常:可以通过继承BaseException类来自定义异常。
class EgonException(BaseException):
    def __init__(self, msg):
        self.msg = msg

    def __str__(self):
        return self.msg

try:
    raise EgonException('类型错误')
except EgonException as e:
    print(e)

在这里插入图片描述

  1. 断言:使用 assert语句进行条件判断,如果条件不满足则抛出 AssertionError异常。
assert 1 == 1
assert 1 == 2

在这里插入图片描述

  1. try…except总结
    • 把错误处理和真正的工作分开,使代码更易组织和清晰。
    • 便于实现复杂的工作任务。
    • 提高程序的安全性,避免因小疏忽导致程序意外崩溃。

四、什么时候用异常处理

有些同学可能认为,学习异常处理后,要为每一段程序都加上 try…except,而不去思考是否会有逻辑错误。但实际上,try…except是附加给程序的异常处理逻辑,与主要工作无关,过多使用会降低代码的可读性。异常处理并非用来弥补不合理的逻辑,只有在错误发生的条件无法预知时,才应该使用 try…except。

结语

通过这个21天的Python计划,我们涵盖了异常处理。希望这些内容能帮助你更好地理解和使用Python。继续学习和实践,你将成为一名优秀的Python开发者!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

互联网搬砖老肖

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

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

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

打赏作者

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

抵扣说明:

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

余额充值