Python3 异常处理介绍和示例

Python 投稿 33200 0 评论

Python3 异常处理介绍和示例

以下主要是针对Python3中类的异常处理介绍和示例。

编写的代码出现异常的情况十分常见,例如下面这段代码。

示例代码:(零除异常)

def get_error():
    print(1 / 0)

get_error()

异常信息:

Traceback (most recent call last): # 回溯(最近一次命令)
  File "D:/MyProject/case.py", line 5, in <module> # 文件"所在路径",位于第2行,模块内
    get_error() # 出错的函数名称
  File "D:/MyProject/case.py", line 3, in get_error # 文件"所在路径",位于第3行,get_error方法中
    print(1 / 0) # 出错的语句
ZeroDivisionError: division by zero # 0除错误:除数为0

异常信息中,我做了中文标注,应该很容易看懂。

当发生异常时,程序捕捉到这个异常显示出来,并且按从外到内的顺序给出了不同层级出错的位置。

这是程序给我们自动抛出的异常信息。

在Python中内置的异常有很多,见下表:(简单看看即可)

BaseException  # 所有异常的超类
 +-- SystemExit # 解释器退出错误
 +-- KeyboardInterrupt # 键盘中断执行错误
 +-- GeneratorExit # 生成器错误
 +-- Exception # 所有标准异常的超类
      +-- StopIteration # 停止迭代错误
      +-- StopAsyncIteration # 停止异步迭代错误
      +-- ArithmeticError # 计算错误
      |    +-- FloatingPointError # 浮点计算错误
      |    +-- OverflowError # 数值溢出错误
      |    +-- ZeroDivisionError  # 零除错误
      +-- AssertionError  # 断言失败错误
      +-- AttributeError # 特性错误
      +-- BufferError # 缓冲错误
      +-- EOFError # EOF标记错误
      +-- ImportError # 导入错误
           +-- ModuleNotFoundError # 模块不存在错误
      +-- LookupError # 查询错误
      |    +-- IndexError # 索引错误
      |    +-- KeyError # 键错误
      +-- MemoryError # 内存错误
      +-- NameError # 标识符错误
      |    +-- UnboundLocalError # 未绑定局部变量错误
      +-- OSError # 操作系统错误
      |    +-- BlockingIOError # 阻塞输入输出错误
      |    +-- ChildProcessError # 子进程错误
      |    +-- ConnectionError # 连接错误
      |    |    +-- BrokenPipeError # 管道中断错误
      |    |    +-- ConnectionAbortedError # 连接失败错误
      |    |    +-- ConnectionRefusedError # 连接拒绝错误
      |    |    +-- ConnectionResetError # 连接重置错误
      |    +-- FileExistsError # 文件已存在的错误
      |    +-- FileNotFoundError # 文件未发现的错误
      |    +-- InterruptedError # 中断错误
      |    +-- IsADirectoryError # 目标为目录的错误
      |    +-- NotADirectoryError # 目录不存在的错误
      |    +-- PermissionError # 许可错误
      |    +-- ProcessLookupError # 进程查询错误
      |    +-- TimeoutError # 超时错误
      +-- ReferenceError # 引用错误
      +-- RuntimeError # 运行时错误
      |    +-- NotImplementedError # 未执行错误
      |    +-- RecursionError # 递归错误
      +-- SyntaxError # 语法错误
      |    +-- IndentationError # 缩进错误
      |         +-- TabError # Tab错误
      +-- SystemError # 系统错误
      +-- TypeError # 类型错误
      +-- ValueError # 值错误
      |    +-- UnicodeError # Unicode相关错误
      |         +-- UnicodeDecodeError # Unicode解码错误
      |         +-- UnicodeEncodeError # Unicode编码错误
      |         +-- UnicodeTranslateError # Unicode转换错误
      +-- Warning # 警告的超类
           +-- DeprecationWarning # 关于弃用功能的警告
           +-- PendingDeprecationWarning # 关于功能将被弃用的警告
           +-- RuntimeWarning # 关于可疑运行时行为的警告
           +-- SyntaxWarning # 关于可疑语法的警告
           +-- UserWarning # 关于由用户代码生成的警告
           +-- FutureWarning # 关于构造将在语义上有改变的警告
           +-- ImportWarning # 关于模块导入中可能出现错误的警告
           +-- UnicodeWarning # 关于Unicode的警告
           +-- BytesWarning # 关于字节和字节数组的警告
           +-- ResourceWarning # 关于资源使用的警告

当异常出现时,系统会给出相应的异常信息。

不过,这些系统给出的异常信息有些艰涩难懂,不够友好。

那么,能不能显示自定义的异常信息呢?

引发异常:raise 语句

我们可以使用raise 语句,显式的引发异常。

示例代码:

num1 = input('请输入被除数:')
num2 = input('请输入除数:')
if int(num2) == 0:
    raise ZeroDivisionError('除数不能为零!')

通过异常类可以调用raise语句,此时我们可以为异常类指定显示的异常信息。

当我们运行代码,输入1和0回车之后,就会显示出异常。

Traceback (most recent call last):
  File "D:/MyProject/case.py", line 5, in <module>
    raise ZeroDivisionError('除数不能为零!')
ZeroDivisionError: 除数不能为零!

这样虽然能够引发异常,也能给出提示,但是需要我们自己来判断输入的内容。

并且,异常信息还不是很友好,至少我想让异常类型也是中文,我也不想看到除了最后一句提示之外的信息。

捕捉异常:try/except 语句

接下来,我们采用科学的方法捕捉可能发生的异常,并在捕捉到异常时进行处理。

示例代码:

while True:
    try:
        num1 = int(input('请输入被除数:'))
        num2 = int(input('请输入除数:'))
        print('计算结果为:', num1 / num2)
    except ZeroDivisionError:
        print('零除错误:除数不能为零!')

当我们运行代码,输入1和0回车之后,这时显示了我们在print语句中输入的提示内容。

try和except语句之间,我们要写入可能会发生异常的语句块,一旦发生指定的异常(except语句中的异常类所对应的异常)就会被except语句捕捉到,然后,在except语句下方可以进行处理。

当然,我们输入的内容也可能不是数值,这个时候怎么将值异常也捕捉到呢?我们可以再加入一个except语句进行捕捉。

示例代码:

except ZeroDivisionError:
    print('零除错误:除数不能为零!')
except ValueError:
    print('数值错误:必须输入数字!')

但是,如果我们想不管是0除错误,还是输入值的错误都给一个共同的提示,怎么处理呢?

我们可以通过except语句捕捉多个异常,然后进行相同的处理。

示例代码:

except (ZeroDivisionError,ValueError):
    print('错误提示:请输入正确的数值!')

还有,如果不想做什么处理,还是显示系统异常信息又怎么处理呢?

还是使用raise语句,不带任何参数即可。

示例代码:

except (ZeroDivisionError,ValueError):
    raise

另外,如果我们不想让程序终止,也要显示异常信息呢?

我们可以把捕捉到的异常通过as关键字存入变量,然后显示输出这个变量。

示例代码:

except (ZeroDivisionError,ValueError) as record:
    print(record)

有的时候,我们不知道都会发生什么异常,可以在except语句后方什么都不添加。

示例代码:

except:
    print('发生了一些错误,但不知道是什么!')

不过这样显然不可取,我们还是希望知道发生了什么?

那就用标准异常的超类帮我们获取所有的异常。

示例代码:

except Exception as e:
    print(e)

这样就能捕获到所有的异常,并且把相应的异常信息显示出来。

除了这些操作,还有这样的操作!

一旦输入错误,我们提示用户,并且重新获取输入,指导输入正确,给出计算结果,

示例代码:

while True:
    try:
        num1 = int(input('请输入被除数:'))
        num2 = int(input('请输入除数:'))
        print('计算结果为:',num1 / num2)

    except Exception as e:
        print(e)
    else:
        break

在上方代码中,我们加入了while循环,并且加入了else子句,这样只要是异常出现就会不停执行try中的语句块,直到输入正确,不再发现异常。这时,会执行else中的语句块,跳出循环。

异常收尾:finally 语句

比如,不管程序有没有正确执行,我们都想提示用户当前程序进行了一次计算。

示例代码:

count = 0
while True:
    try:
        num1 = int(input('请输入被除数:'))
        num2 = int(input('请输入除数:'))
        print('计算结果为:', num1 / num2)

    except Exception as e:
        print(e)
    else:
        break
    finally:
        count += 1
        print('第%d次计算完毕!' % count)

我们在程序的开始定义了一个全局变量count,不管计算是否有异常出现,我们都在finally中进行计数的递增,并显示输出提示。

编程笔记 » Python3 异常处理介绍和示例

赞同 (47) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽