python基础-异常
什么是异常?
python用异常对象(exception object)来表示异常情况。遇到错误后,就会引发异常。如果异常未被处理或捕获,程序就会用所谓的回溯(traceback)终止执行。
>>> 1 / 0 Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: integer division or modulo by zero
如何引发异常?
使用raise语句引发异常:可以使用一个类(Exception的子类)或者实例参数调用raise语句。使用类时,程序会自动创建实例。
>>> raise Exception Traceback (most recent call last): File "<stdin>", line 1, in <module> Exception >>> raise Exception(‘some wrong‘) Traceback (most recent call last): File "<stdin>", line 1, in <module> Exception: some wrong
exceptions模块中内置的异常类:
>>> import exceptions >>> dir(exceptions) [‘ArithmeticError‘, ‘AssertionError‘, ‘AttributeError‘, ‘BaseException‘, ‘BufferError‘, ‘BytesWarning‘, ‘DeprecationWarn ing‘, ‘EOFError‘, ‘EnvironmentError‘, ‘Exception‘, ‘FloatingPointError‘, ‘FutureWarning‘, ‘GeneratorExit‘, ‘IOError‘, ‘I mportError‘, ‘ImportWarning‘, ‘IndentationError‘, ‘IndexError‘, ‘KeyError‘, ‘KeyboardInterrupt‘, ‘LookupError‘, ‘MemoryE rror‘, ‘NameError‘, ‘NotImplementedError‘, ‘OSError‘, ‘OverflowError‘, ‘PendingDeprecationWarning‘, ‘ReferenceError‘, ‘R untimeError‘, ‘RuntimeWarning‘, ‘StandardError‘, ‘StopIteration‘, ‘SyntaxError‘, ‘SyntaxWarning‘, ‘SystemError‘, ‘System Exit‘, ‘TabError‘, ‘TypeError‘, ‘UnboundLocalError‘, ‘UnicodeDecodeError‘, ‘UnicodeEncodeError‘, ‘UnicodeError‘, ‘Unicod eTranslateError‘, ‘UnicodeWarning‘, ‘UserWarning‘, ‘ValueError‘, ‘Warning‘, ‘WindowsError‘, ‘ZeroDivisionError‘, ‘__doc_ _‘, ‘__name__‘, ‘__package__‘]
自定义异常类
创建的异常类需从Exception类直接或者间接继承。
class SomeCustomException(Exception): pass
捕捉异常
使用try/except语句捕捉异常:
try: 1 / 0 except ZeroDivisionError: print "The second number can‘t be zero!"
捕捉异常之后重新引发异常
使用无参数的raise语句重新引发异常
class MuffledCalculator: muffled = False def calc(self, expr): try: return eval(expr) except ZeroDivisionError: if self.muffled: print "Division by zero is illegal" else: raise
>>> calculator = MuffledCalculator() >>> calculator.calc(‘10 / 2‘) 5 >>> calculator.calc(‘10 / 0‘) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 5, in calc File "<string>", line 1, in <module> ZeroDivisionError: integer division or modulo by zero >>> calculator.muffled = True >>> calculator.calc(‘10 / 0‘) Division by zero is illegal >>>
捕捉多个异常
1.可以增加多个except子句
try: 1 / 0 except ZeroDivisionError: print "Division by zero is illegal" except TypeError: print "That wasn‘t a number. was it?"
2.用一个块捕捉异常
try: 1 / 0 except (ZeroDivisionError, TypeError, NameError): print "Your numbers were bogus"
捕捉对象
如果希望在except子句中访问异常对象本身,可以使用两个参数
try: 1 / 0 except (ZeroDivisionError, TypeError, NameError), e: print e
捕捉全部异常
try: 1 / 0 except: print ‘Something wrong happened‘
else子句
else在当未发生异常时执行
try: 1 / 2 except: print ‘Something wrong happened‘ else: print ‘normal‘
finally子句
不管异常是否会发生,finally子句总是会执行。它可以用来在可能的异常后面进行清理的工作。
try: 1/ 0 except NameError: print ‘Unknown variable‘ else: print ‘That went well!‘ finally: print ‘Cleaning up‘
finally用来关闭文件或者网络套接字是会非常有用。
异常和函数
如果异常在函数内引发而不被处理,它就会传播至函数调用的地方。如果在那里也没被处理,它就会继续传播,一直到达主程序。如果那里没有异常处理程序,程序就会带着堆栈跟踪中止。
例子:
>>> def faulty(): ... raise Exception(‘someting is wrong‘) ... >>> def ignore_exception(): ... faulty() ... >>> def handle_exception(): ... try: ... faulty() ... except: ... print ‘Exception handled‘ ... >>> ignore_exception() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in ignore_exception File "<stdin>", line 2, in faulty Exception: someting is wrong >>> handle_exception() Exception handled >>>
faulty中产生的异常通过faulty和ignore_exception传播,最终导致了堆栈跟踪。同样地,它也传播到了handle_exception,但在这个函数中被try/except语句处理。
只要异常try/except语句查看对象是否存在特定的特性:
class TestClass: pass if __name__ == ‘__main__‘: obj = TestClass() try: obj.write except AttributeError: print ‘The object is not writeable‘ else: print ‘The object is writeable‘
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。