try-except-else-finally语句:
语法:
try:
try_suite
except Exception1:
suite_exception1
except (Exception2,Exception3):
suite23_exception23
...
else:
else_suite
finally:
finally_suite
可以替换为在try-finally语句中嵌套try-except语句的形式
自定义异常:
raise语句可显式触发异常:
raise [SomeException [,args [,traceback]]]
SomeException:可选,异常的名字,仅能使用字符串、类或实例
args:可选,以元组的形式传递给异常的参数
traceback:可选,异常触发时新生成的一个用于异常-正常化的跟踪记录,多用于重新引发异常时
异常对象:
- Python异常是内置的经典类Exception的子类的实例
- 为了向后兼容,Python还允许使用字符串或任何经典类实例
- Python2.5之后,Exception是从BaseException继承的新式类
- Python自身引发的所有异常都是Exception的子类的实例
- 大多的标准异常都是由StandardError派生的,其有3个抽象的子类:
- ArithmeticError
- 由于算术错误而引发的异常基类
- OverflowError, ZeroDivisionError, FloatingPointError
- LookupError
- 容器在接收到一个无效键或索引时引发的异常的基类
- IndexError,KeyError
- EnvironmentError
- 由于外部原因而导致的异常的基类
- IOError, OSError, WindowsError
标准异常类:
- AssertionError
- AttributeError
- FloatingPointError
- IOError
- ImportError
- import语句不能找到要导入的模块,或者不能找到该模块特别请求的名称
- IndentationError
- IndexError
- KeyError
- KeyboardInterrupt
- 用户按了中断键(Ctrl+c,Ctrl+Break或Delete键)
- MemoryError
- NameError
- NotImplementedError
- 由抽象基类引发的异常,用于指示一个具体的子类必须覆盖的一个方法
- OSError
- 由模块os中的函数引发的异常,用来指示平台相关的错误
- OverflowError
- SyntaxError
- SystemError
- TypeError
- UnboundLocalError
- UnicodeError
- ValueError
- 应用于某个对象的操作或函数,这个对象具有正确的类型,但确有不适当的值
- WindowsError
- 模块os中的函数引发的异常,用来指示与Windows相关的错误
- ZeroDivisionError
自定义异常类:
自定义异常和多重继承:
较有效的方法是从自定义异常类和标准异常类进行多重继承,例如
class CustomAttributeError(CustomException,AttributeError):
pass
标准库中使用的其他异常:
Python标准库中的许多模块都定义了自己的异常类,如socket中的socket.error
等同于自定义的异常类
assert语句:
assert语句用于在程序中引入调试代码
assert condition[, expression]
如果condition条件满足,则assert不做任何操作
如果condition条件不满足,则assert使用expression作为参数实例化AssertionError并引发结果实例
注意:
如果运行Python时使用了-O优化选项,则assert将是一个空操作:编译器不为assert语句生成代码
运行Python时不使用-O选项,则__debug__内置变量为True,否则其值为False
assert语句相当于下面的代码:
if __debug__:
if not condition:
raise AssertionError, <expression>