首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Python编程技巧 – 异常处理

  • 25-03-02 15:01
  • 3286
  • 6872
blog.csdn.net

Python编程技巧 – 异常处理

Python Programming Skills – Exception Handling

By Jackson@ML

每一个程序都未必是健壮的,有时候很脆弱。只有在人的理想思维状况下,返回的结果才是正确的,如意的。

1. 错误发生及异常输出

面对种种编写有疏漏的程序,常常会出现错误,下面举出不同的例子,来看会出现哪些问题。
1) 例如,print()语句执行时,缺少了括号,如下代码:

print "Hello, world!"
  File "", line 1
    print "Hello, world!"
    ^^^^^^^^^^^^^^^^^^^^^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
  • 1
  • 2
  • 3
  • 4
  • 5

提示Syntax Error(即:语法错误)。

通过以下的例子,可以看到其它异常。除数等于零时,被除数除以它就会报错。

 x = 5 / 0
Traceback (most recent call last):
  File "", line 1, in <module>
ZeroDivisionError: division by zero
  • 1
  • 2
  • 3
  • 4

还有一个例子:

lst = [1, 2, 3]
print(lst[3])

Traceback (most recent call last):
  File "", line 1, in <module>
IndexError: list index out of range
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

仍有一个例子:

d = {'a': 'hello'}
d['b']

  Traceback (most recent call last):
       File "", line 1, in <module>
  KeyError: 'b'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

提示KeyError,即字典对象的键 ‘b’不存在,导致异常。

我们注意到相关异常的名字都有个共同点,即以Error结尾。在Python编程语言中,error和exception几乎是可以交换使用的。但是,往往错误比异常更加严重。

前述相关的例子中所有的错误类都继承自Exception。

2. 抛出异常

有了异常,就需要着手处理。做项目过程中,实际探究一下Python程序需要通知用户或调用输入不合法的函数,那该如何处理?

先来看以下这个类,用来添加偶数到列表中。

class EvenOnly (list):
    def append(self, integer):
        if not isinstance (integer, int):
            raise TypeError ("Only integers can be added to lists")
        if integer % 2:
            raise ValueError ("Only even numbers can be added to lists")
        super().append(integer)        
e = EvenOnly()
e.append("a string")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在Visual Studio Code中执行,结果如下图所示:

在这里插入图片描述

出现TypeError类型错误!,意思是只有整数能够添加,而字符串“a string”违背了这一原则,因此报错。

修改最后一个语句为:

e.append(3)
  • 1

执行结果如下图所示:
在这里插入图片描述

这次出现了不一样的报错,即ValueError,属于数值错误,提示仅有偶数可以被添加;由于整数3是奇数,并不是偶数,因此报错。

3. 异常作用

像上述的例子,都属于程序抛出了异常,看起来似乎立即停止了程序运行。这是正常的流程,即抛出异常后,所有代码都不会继续被执行,而是停止,除非处理了异常。

接下来,看一个无返回值的函数,按照这个逻辑来写这个函数,其中,使用Raise抛出一个明确的异常(提醒用户发生了什么):

def novalue_return():
    print("I am going to raise an exception")
    raise Exception("Raised Exception!")
    print("This will never execute.")
    return "No value returned."
novalue_return()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

执行结果如下图所示:
在这里插入图片描述
这次,抛出了程序设定的异常,即Exception: Raised Exception! 尽管看起来不是特别详尽,但是这个异常可以自己随意设定。

如果了解到程序有可能抛出最接近的类别的异常,那么输出的异常字符串就能更好更精确地指导程序完善过程,使得代码精进成为可能。

4. 异常处理

异常发现了,也能够自行设定抛出了。那么,当遇到一个异常情况,代码应该如何应对或者从中恢复呢?我们需要恰当的异常处理方法。

使用 try…except 语句块包裹可能抛出的异常的代码,就是不错的选择。修改上述代码如下操作:

def novalue_return():
    print("I am going to raise an exception")
    raise Exception("Raised Exception!")
    print("This will never execute.")
    return "No value returned."
try:
    novalue_return()
except:
    print("An exception was caught!")
print("This will be executed after the exception")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

可以看到,在原本需要直接执行的novalue_return()语句,被try … except块包裹,完成后再打印一个语句说明在异常之后执行。

执行该程序如下图所示:

在这里插入图片描述
显而易见,在程序执行中,按照我设定的步骤,由于发生了异常,则执行except块,打印输出An exception was caught!(一个异常被捕获);最后,打印常规语句,说明在异常之后执行。

一旦捕获异常,那么就能够进行代码的善后清理,并且继续执行代码,而不受异常函数的影响。

抛出异常后,novalue_return()函数的剩余代码仍然不会执行,但是调用这个函数的代码能够恢复,并且继续执行。

本文简述了异常的基本机制,异常的出现,如何抛出以及处理异常。感谢您的阅读。


技术好文陆续推出,敬请关注。

喜欢就点赞哈!您的认可,我的动力。?

相关阅读:

  1. Python编程技巧 - 迭代器(Iterator)
  2. Python编程技巧 - Lambda函数
  3. Python编程技巧 - 使用字典
  4. Python编程技巧 - 使用字符串
  5. Python编程技巧 - 对象和类
  6. Python编程技巧 - 使用列表(List)
  7. Python编程技巧 - 转换二进制、八进制和十六进制的函数
  8. Python编程技巧 - 函数入门
  9. 安装最新版Visual Studio Code来开发Python应用程序
  10. 2023最新版Python 3.12.0安装使用指南
文章知识点与官方知识档案匹配,可进一步学习相关知识
Python入门技能树首页概览388936 人正在系统学习中
注:本文转载自blog.csdn.net的Jackson@ML的文章"https://blog.csdn.net/jackson_lingua/article/details/134860674"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top