所谓异常指的是程序的执行出现了非预期行为,就好比现实中的做一件事过程中总会出现一些意外的事。异常的处理是跨越编程语言的,和具体的编程细节相比,程序执行异常的处理更像是哲学。限于认知能力和经验所限,不可能达到像解释器下导入该看到的python设计之禅一样,本文就结合实际使用简单的聊一聊。
工作中,程序员之间一言不合就亮代码,毕竟不管是代码本身还是其执行过程,不会存在二义性,更不会含糊不清,代码可谓是程序员之间的官方语言。但是其处理问题的逻辑或者算法则并非如此。
让我至今记忆犹新的两次程序员论剑有:
反问一:项目后期所有的异常处理都要去掉,不允许上线后出现未知的异常,把你这里的异常处理去掉,换成如果别的;
反问二:这里为什么要进行异常处理?代码都是你写的,怎么会出现异常呢?
这是我亲身经历的,不知道大家碰到这两个问题会怎样回答,至少我当时竟无言以对。这两个问题分别在不同的时间针对不同的问题出自一个互联网巨头中某个资深QA和资深开发的反问。
暂且不论对错,毕竟不同人考虑问题的出发点是不同的。但是从这么坚决的去异常处理的回答中至少有一点可以肯定,那就是很多人对自己的代码太过自信或者说是察觉代码潜在问题的直觉力不够,更别提正确的处理潜在的问题以保证重要业务逻辑的处理流程。写代码的时候如果只简单考虑正常的情况,那是在往代码中下毒。
接下类本篇博文将按照套路出牌(避免被Ctrl + W),介绍一下python的异常处理的概念和具体操作。
常见的程序无缺陷非就两大类:
-
<李>语法错误;李>
<李>逻辑不严谨或者思维混乱导致的逻辑错误;李>
显然第二种错误更难被发现,且后果往往更严重。无论哪一种错误,有两种后果等着我们:一,程序崩掉;二,执行结果不符合预期;
对于一些重要关键的执行操作,异常处理可以控制程序在可控的范围执行,当然前提是正确的处理。
比如我们给第三方提供的API或者使用第三方提供的API。多数情况下要正确的处理调用者错误的调用参数和返回异常结果的情况,不然就可能要背黑锅了。
在不可控的环境中运行程序,异常处理是必须的。然而困难的地方是当异常发生时,如何进行处理。
下面逐步介绍一下python异常处理相关的概念。
<强> 2.1异常处理结构强>
必要的结构为试一试……除了,至少有一个除外,否则和最终可选。
试一试: 代码块 (例外Class1、异常Class2…除外)e: 捕获和处理异常 除了例外ClassN: 捕获和处理异常 …… 其他: 当任何意想不到的事情发生了 最后: 总是时执行>之前结束<强> 2.2 python内置异常类型强>
模块异常中包含了所有内置异常类型、类型的继承关系如下:
BaseException + - - - SystemExit + - - - KeyboardInterrupt + - - - GeneratorExit + - - -异常 + - - -抛出StopIteration + - - - StandardError | +——BufferError | +——ArithmeticError | | +——FloatingPointError | | +——OverflowError | | +——ZeroDivisionError | +——AssertionError | +——AttributeError | +——EnvironmentError | | +——IOError。那么 | | +——OSError | | +——WindowsError (Windows) | | +——VMSError (VMS) | +——EOFError | +——ImportError | +——LookupError | | +——IndexError | | +——KeyError | +——MemoryError | +——NameError | | +——UnboundLocalError | +——ReferenceError | +——RuntimeError | | +——NotImplementedError | +——SyntaxError | | +——IndentationError | | +——TabError | +——SystemError | +——TypeError | +——ValueError | +——UnicodeError | +——UnicodeDecodeError | +——UnicodeEncodeError | +——UnicodeTranslateError +,警告 + - - - DeprecationWarning + - - - PendingDeprecationWarning + - - - RuntimeWarning + - - - SyntaxWarning + - - - UserWarning + - - - FutureWarning + - - - ImportWarning + - - - UnicodeWarning + - - - BytesWarning深入理解Python异常处理的哲学