Python 异常

前言

在Python中,所有的异常都是类,并且都继承自BaseException。Python的异常处理和Java的异常处理规则比较类似,Java的异常处理规则:try-catch-finally,Python的规则是:try-except-finally;Java中使用throw关键字抛出异常,Python使用raise关键字抛出异常,总体来说,大同小异。

内置异常

  1. BaseException:所有异常的基类
  2. Exception: 常规错误的基类,继承自BaseException
  3. ValueError:值错误异常,继承自Exception
  4. UnicodeError:Unicode编码异常,继承自ValueError
  5. TypeError:类型异常,继承自Exception
  6. IOError:I/O异常,继承自Exception
  7. ……

自定义异常

自定义异常,一般情况下,我们继承自Exception类。

"""
Python 异常学习
"""

__author__ = 'Pan Li'

#自定义异常,继承自Exception
class ParamError(Exception):

#类似于java中的构造函数,self类似于java中的this
def __init__(self, code, message):
#调用父类的初始化方法
Exception.__init__(self, message)
self.code = code
self.message = message

捕捉异常

除了关键字之外,规则基本和java一致。else是在没有发生异常时执行,而不是发生了异常但没有except到指定异常时执行。同java捕捉异常规则一样,如果最前面的是except BaseException as e ,那么后面的所有的异常except分支都将会被这个所拦截,而不会继续向下传递。

  1. try-except-finally
  2. try-except-else-finally
  3. try-except-except-else-finally
  4. try-finally: 执行finally语句,异常继续向上抛出
# 定义累加函数
def accumulate(n):
if not isinstance(n, int):
raise TypeError("不合法的参数值,必须是整数")
elif n < 0:
raise ParamError(-1, "不合法的参数值,必须大于或等于0")

if n == 0:
return 0
elif n == 1:
return 1
else:
return n + accumulate(n-1)

#捕捉异常
result = 0;
try:
result = accumulate(100)
except TypeError as e:
print("TypeError error." ,e)
except ParamError as e:
print("ParamError error.", e)
else:
print("没有发生异常,结果为:", result)
finally:
print("释放系统资源")