浅谈Python异常处理机制 图片看不了?点击切换HTTP 返回上层
异常处理机制己经成为衡量一门编程语言是否成熟的标准之一,使用异常处理机制的 Python 程序具有更好的容错性,更加健壮。
无论是多优秀的程序员,都无法保证自己写的程序永远不会出错,即便程序没有错误,也无法保证用户总是按自己的意愿来输入,就算用户都是非常“聪明而且配合”的,也无法保证运行该程序的操作系统永远稳定,无法保证运行该程序的硬件不会突然坏掉,无法保证网络永远通畅……无法保证的情况太多了。但作为一个程序设计人员,我们需要尽可能预知所有可能发生的情况,尽可能保证程序在所有糟糕的情形下都能正常运行。
考虑实现一个五子棋程序时,当用户输入下棋坐标时,程序要判断用户输入是否合法。如果保证程序有较好的容错性,将会有如下伪码:
如果每次在实现真正的业务逻辑之前,都需要不厌其烦地考虑各种可能出错的情况,针对各种错误情况给出补救措施,这是多么乏味的事情啊。程序员喜欢解决问题,喜欢开发带来的“创造”快感,但不喜欢像一个“堵漏”工人,去堵那些由外在条件造成的“漏洞”。
对于构造大型、健壮、可维护的应用而言,错误处理是整个应用需要考虑的重要方面,程序员不能仅仅只做“对”的事情,程序员开发程序的过程,是一个创造的过程,这个过程需要有全面的考虑,仅做“对”的事情是远远不够的。
对于上面的错误处理机制,主要有如下两个缺点:
程序员希望有一种强大的机制来解决上面的问题,希望将上面程序改成如下伪码:
现在的问题是,“用户输入不合法”这个条件怎么定义?当然,对于这个简单的要求,可以使用正则表达式对用户输入进行匹配,当用户输入与正则表达式不匹配时即可判断“用户输入不合法”。但对于更复杂的情形,就没有这么简单了。使用 Python 的异常处理机制就可以解决这个问题。
无论是多优秀的程序员,都无法保证自己写的程序永远不会出错,即便程序没有错误,也无法保证用户总是按自己的意愿来输入,就算用户都是非常“聪明而且配合”的,也无法保证运行该程序的操作系统永远稳定,无法保证运行该程序的硬件不会突然坏掉,无法保证网络永远通畅……无法保证的情况太多了。但作为一个程序设计人员,我们需要尽可能预知所有可能发生的情况,尽可能保证程序在所有糟糕的情形下都能正常运行。
考虑实现一个五子棋程序时,当用户输入下棋坐标时,程序要判断用户输入是否合法。如果保证程序有较好的容错性,将会有如下伪码:
if 用户输入包含除逗号之外的其他非数字字符:
alert 坐标只能是数值
goto retry
elif 用户输入不包含逗号:
alert 应使用逗号分隔两个坐标值
goto retry
elif 用户输入的坐标值超出了有效范围:
alert 用户输入的坐标应位于棋盘坐标之内
goto retry
elif 用户输入的坐标已有棋子:
alert "只能在没有棋子的地方下棋"
goto retry
else:
#业务实现代码
...
如果每次在实现真正的业务逻辑之前,都需要不厌其烦地考虑各种可能出错的情况,针对各种错误情况给出补救措施,这是多么乏味的事情啊。程序员喜欢解决问题,喜欢开发带来的“创造”快感,但不喜欢像一个“堵漏”工人,去堵那些由外在条件造成的“漏洞”。
对于构造大型、健壮、可维护的应用而言,错误处理是整个应用需要考虑的重要方面,程序员不能仅仅只做“对”的事情,程序员开发程序的过程,是一个创造的过程,这个过程需要有全面的考虑,仅做“对”的事情是远远不够的。
对于上面的错误处理机制,主要有如下两个缺点:
- 无法穷举所有的异常情况。因为人类知识的限制,异常情况总比可以考虑到的情况多,总有“漏网之鱼”的异常情况,所以程序总是不够健壮。
- 错误处理代码和业务实现代码混杂。这种错误处理和业务实现混杂的代码严重影响程序的可读性,会增加程序维护的难度。
程序员希望有一种强大的机制来解决上面的问题,希望将上面程序改成如下伪码:
if 用户输入不合法:
alert 输入不合法
goto retry
else :
#业务实现代码
...
现在的问题是,“用户输入不合法”这个条件怎么定义?当然,对于这个简单的要求,可以使用正则表达式对用户输入进行匹配,当用户输入与正则表达式不匹配时即可判断“用户输入不合法”。但对于更复杂的情形,就没有这么简单了。使用 Python 的异常处理机制就可以解决这个问题。