《Python基础教程》学习笔记之[D9]异常

时间:2022-08-30 23:52:50

只做涂鸦笔记之用,如有疑议等问题可留言探讨。


#!/usr/bin/env python2.7
# -*- coding: utf-8 -*- 

# 异常 Exception

# 按照自己的方式出错


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

raise Exception('Your exception message')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Exception: Your exception message

#以上只是一个简单的触发异常的例子

#内建的异常类型有很多,使用 dir函数列出 exceptions 模块的内容
>>> import exceptions
>>> dir(exceptions)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'Buffer
Error', 'BytesWarning', 'DeprecationWarning', 'EOFError', 'EnvironmentError', 'E
xception', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'I
mportError', 'ImportWarning', 'IndentationError', 'IndexError', 'KeyError', 'Key
boardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'NotImplementedError
', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'ReferenceError', 'R
untimeError', 'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError',
 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TypeError', 'Unbound
LocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'Unicod
eTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'Win
dowsError', 'ZeroDivisionError', '__doc__', '__name__', '__package__']
>>>

# 所有这些异常都可以在 raise 使用

# 一些重要的异常,掌握这些,可以很快的分析出程序出问题的原因
Exception
AttributeError
IOError
IndexError
KeyError
NameError
TypeError
SyntaxError
ValueError
ZeroDivisionError

# 自定义异常,直接或者间接从 Exception类继承
class MyException(Exception):
    pass

class MyException(IOError):
    pass

# 捕捉异常
try:
    # code
except Exception:       # Exception 可以选择
    # message

# 还可以使用多个 except

try:
    # todo
except ZeroDivisionError:
    # todo
except TypeError:
    # toto

# 一块语句,捕捉多个异常
try:
    # todo
except (ZeroDivisionError, TypeError): # 3.0中有所改变  excetp (ZeroDivisionError, TypeError) as e
    # todo 

# else 语句

try:
    # todo
except:
    # todo
else:       # 程序没有发生异常的情况下,会执行此语句
    # todo

# finally 语句 不管异常是否发生,都会被执行
# 与 try联合使用

try:
    # todo
finally:
    # todo

try:
    # todo
except:
    # todo
finally:        # 2.5版本之前,要独立使用,2.5以后,可以*组合
    # todo

# 异常和函数, 异常是层层向上传递的
def faulty():
    raise Exception('some message')

def ignore_exception():
    faulty()

def handle_exception():
    try:
        faulty()
    except:
        print 'Exception handle'

>>> 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: some message
>>> handle_exception()
Exception handle
>>>

# 出错应该尽可能的使用 try/except 替代if/else ,这样更python化

# 涉及函数
warning.filterwarnings(action,...)