python学习笔记-错误处理

程序中的错误处理有多种方式,一类是约定好错误码,然后根据返回的错误码来判断是否发生错误,以及错误的原因。

但是这么做容易将正确的返回值和错误码混在一起,必须要写很多代码来区分,非常不方便。
另外一旦出错,还需要一级一级往上报,知道有一级可以处理它。

比较成熟的做法是try...except...finally...这一套错误处理机制。该机制不会干扰正常的返回值。同时也无需一级一级手动上报,而是只需要有一级捕获并处理即可。

代码:

try:
    print open("Demo.py", 'r')
    n = 1 / 0
except ZeroDivisionError, e:
    print "zeroDivisionError", e
except ValueError, e:
    print "ValueError", e
else:
    print "No Error catched"
finally:
    print "finally"

使用错误处理有几个点需要注意:

  1. 可以写多个except用于捕获多个exception

  2. 父类exception可以捕获子类的exception,已经被捕获的exception不会再被传递给其他exception。

  3. 可以用else来处理没有exeption的情况

  4. finally是无论有无错误都会执行。

Build-in Exception的种类

Python(2.x)内置Exception的继承关系见下图:

The class hierarchy for built-in exceptions is:
BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- 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
      +-- Warning
           +-- DeprecationWarning
           +-- PendingDeprecationWarning
           +-- RuntimeWarning
           +-- SyntaxWarning
           +-- UserWarning
           +-- FutureWarning
       +-- ImportWarning
       +-- UnicodeWarning
       +-- BytesWarning

当然我们也可以自定义一个类,例如:

class MyException(StandardException):
    pass

当然,推荐使用Build-in的Exception。在Build-in的Exception中找不到我们所需要的Exception的时候,我们才自定义Exception。

抛出自定义Exception使用以下语法:

raise MyException("this is my Exception")

Exception的记录

在测试代码中,我们对Exception的处理中可以直接print exception。但是实际生产代码中直接打印log可能不是很妥。我们可以通过简单的配置使用logging.exception(msg)将错误打印到日志中。
如何正确使用python内置的logging模块,可以另开一篇文章介绍。

    原文作者:xcwong
    原文地址: https://segmentfault.com/a/1190000008045983
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞