异常机制已经成为衡量编程语言成熟度的标准之一。使用异常处理机制的 Python 程序具有更好的容错性并且更健壮。
对于计算机程序,情况就更复杂了——没有人能保证自己编写的程序永远不会运行!即使程序没有错误,你能保证用户总是输入你想要的吗?就算用户很“聪明、配合”,你能保证运行程序的操作系统永远稳定吗?你能保证运行程序的硬件不会突然失效吗?你可以保证网络永远畅通……你不能保证的情况太多了!
对于一个程序设计者来说,要尽可能地预测所有可能出现的情况,尽可能保证程序在所有不良情况下都能运行。
考虑前面介绍的五子棋程序:当用户输入游戏的坐标时,程序需要判断用户的输入是否合法。如果保证程序有较好的容错性,就会有如下伪代码:
if 用户输入包含除逗号之外的其他非数字字符:
alert 坐标只能是数值
goto retry
elif 用户输入不包含逗号:
alert 应使用逗号分隔两个坐标值
goto retry
elif 用户输入的坐标值超出了有效范围:
alert 用户输入的坐标应位于棋盘坐标之内
goto retry
elif 用户输入的坐标已有棋子:
alert "只能在没有棋子的地方下棋"
goto retry
else:
#业务实现代码
...
上面的代码没有涉及任何有效的处理,只是考虑了4种可能的错误,代码量急剧增加。但实际上,上面考虑的四种情况远远不能涵盖所有可能的情况(事实上,世界上有无数的意外),程序中可能出现的异常情况总是比程序员可以考虑的意外多。
而正如前面所说,自大的程序员在开发程序时更倾向于思考:“是的,错误可能会发生,但那是别人造成的,关我什么事”。
如果每次都在实现真正的业务逻辑之前,还要不厌其烦地考虑各种可能的错误情况,并针对各种错误情况给出补救措施,那将是多么乏味。程序员喜欢解决问题,喜欢开发带来的“创造”的乐趣,但不喜欢像一个“堵漏”工,堵住那些因外界条件造成的“漏洞”。
对于构建大规模、健壮和可维护的应用程序,错误处理是整个应用程序的一个重要方面。程序员不能只做“正确”的事。程序员开发程序的过程是一个创造性的过程。过程需要综合考虑,仅仅做“正确”的事情是不够的。
对于上面的错误处理机制,主要有两个缺点:
不可能详尽列出所有异常情况。由于人类知识的局限性,总是有比能够考虑的更多的异常情况,总有“漏网之鱼”的异常情况,所以程序总是不够健壮。
错误处理代码和业务实现代码混在一起。这种混合错误处理和业务实现的代码严重影响了程序的可读性,增加了程序维护的难度。
程序员希望有一个强大的机制来解决上面的问题,希望把上面的程序改成下面的伪代码:
if 用户输入不合法:
alert 输入不合法
goto retry
else :
#业务实现代码
...
上面的伪代码提供了一个非常强大的“if块”,即不管输入错误的原因是什么,只要用户输入不符合要求,程序就会一次性处理所有的错误。这种方式的好处是让错误处理代码更有条理,只需要在一个地方处理错误。
现在的问题是,如何定义“用户输入非法”的条件?当然,对于这种简单的需求,可以使用正则表达式来匹配用户输入。当用户输入与正则表达式不匹配时,可以判断为“用户输入不合法”。但对于更复杂的情况,就没那么简单了。使用Python的异常处理机制可以解决这个问题。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 如何检查python变量的类型12/09
- ♥ python with 语句是如何工作的12/31
- ♥ 初学者学c还是学python?12/22
- ♥ 如何在python中读取文件09/07
- ♥ 如何以python函数形式实现生成器11/14
- ♥ 了解python的join()方法的用法和用法09/13
内容反馈