概要:

一、异常

二、按自己的方式出错。

二、捕捉异常

三、except子句

四、用一个块捕捉两个异常

五、捕捉对象

 

一、异常

常常为了能够处理异常事件(比如除0),可以在所有可能发生这类事件的地方都使用条件语句,这样没效率、不灵活。想直接忽略这些异常事件,期望它们永不发生,Python的异常对象提供了非常强大的替代解决方案。

Python用异常对象(exception object)来表示异常情况。遇到错误,会引发异常。如果异常对象并未被处理或捕捉,程序就会用所谓的回溯(Traceback,一种错误信息)终止执行。

每个异常都是一些类的实例。

二、按自己的方式出错。

异常可以在某些东西出错时自动引发。

我们自己也可以引发异常--创建自己的异常类型:

1、raise 语句

引发异常,可以使用一个类(应该是Exception的子类)或者实例参数调用raise语句。使用类时,程序会自动创建实例。

使用内建的Exception异常类

>>> raise Exception

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    raise Exception
Exception


>>> raise Exception('you fogot to do something before!') #添加错误信息

Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    raise Exception('you fogot to do something before!') #添加错误信息
Exception: you fogot to do something before!
>>> 

关于内建异常类可参Python库参考手册的“Built-Exceptions”。
可以使用 dir 函数列出exceptions模块的内容:

>>> import exceptions
>>> dir(exceptions)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BufferError', 'BytesWarning', 'DeprecationWarning', 'EOFError', 'EnvironmentError', 'Exception', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError', 'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '__doc__', '__name__', '__package__']

 

所有这些异常都可以在raise语句中:

>>> raise ArithmeticError

Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    raise ArithmeticError
ArithmeticError

 

2、自定义异常类

想要使用特殊的错误代码处理某错误,就需要一个独立于exceptions模块的异常类。

基本上如下:

>>> class SomeCustomException(Exception):
    pass

 

二、捕捉异常

诱捕(捕捉)异常:处理异常。

>>> try:
    x = input('Enter the first number: ')
    y = input('Enter the second number: ')
    print x/y
except ZeroDivisionError:
    print "The second number can't be zero ! "

    
Enter the first number: 3
Enter the second number: 0
The second number can't be zero ! 

【注意】如果没有捕捉异常,它就会被“传播”到调用函数中。如果在那里依然没有捕获,这些异常就会“浮”到程序的最顶层。也就是说你可以捕捉到其他人的函数中所引发的异常。

如果捕捉到异常,又想重新引发它(传递异常),可以调用不带参的raise。

三、except子句

四、用一个块捕捉两个异常

五、捕捉对象