异常就是运行期检测到的错误。计算机语言针对可能出现的错误定义了异常类型,某种错误引发对应的异常时,异常处理程序将被启动,从而恢复程序的正常运行。
 
1. Python 标准异常总结
BaseException:所有异常的 基类
Exception:常规异常的 基类
StandardError:所有的内建标准异常的基类
ArithmeticError:所有数值计算异常的基类
FloatingPointError:浮点计算异常
OverflowError:数值运算超出最大限制
ZeroDivisionError:除数为零
AssertionError:断言语句(assert)失败
AttributeError:尝试访问未知的对象属性
EOFError:没有内建输入,到达EOF标记
EnvironmentError:操作系统异常的基类
IOError:输入/输出操作失败
OSError:操作系统产生的异常(例如打开一个不存在的文件)
WindowsError:系统调用失败
ImportError:导入模块失败的时候
KeyboardInterrupt:用户中断执行
LookupError:无效数据查询的基类
IndexError:索引超出序列的范围
KeyError:字典中查找一个不存在的关键字
MemoryError:内存溢出(可通过删除对象释放内存)
NameError:尝试访问一个不存在的变量
UnboundLocalError:访问未初始化的本地变量
ReferenceError:弱引用试图访问已经垃圾回收了的对象
RuntimeError:一般的运行时异常
NotImplementedError:尚未实现的方法
SyntaxError:语法错误导致的异常
IndentationError:缩进错误导致的异常
TabError:Tab和空格混用
SystemError:一般的解释器系统异常
TypeError:不同类型间的无效操作
ValueError:传入无效的参数
UnicodeError:Unicode相关的异常
UnicodeDecodeError:Unicode解码时的异常
UnicodeEncodeError:Unicode编码错误导致的异常
UnicodeTranslateError:Unicode转换错误导致的异常
2. Python标准警告总结
Warning:警告的基类
DeprecationWarning:关于被弃用的特征的警告
FutureWarning:关于构造将来语义会有改变的警告
UserWarning:用户代码生成的警告
PendingDeprecationWarning:关于特性将会被废弃的警告
RuntimeWarning:可疑的运行时行为(runtime behavior)的警告
SyntaxWarning:可疑语法的警告
ImportWarning:用于在导入模块过程中触发的警告
UnicodeWarning:与Unicode相关的警告
BytesWarning:与字节或字节码相关的警告
ResourceWarning:与资源使用相关的警告
 
1、普通模式try-except
 
try:
    f = open('1.txt')
    print(f.read())
    f.close()
except OSError as  error:
    # print("打开文件错误!")
    print('打开文件出错\n原因是:'+str(error))
 
2、多个except
 
try:
    int("abc")
    s = 1 + '1'
    f = open('test.txt')
    print(f.read())
    f.close()
except OSError as error:
    print('打开文件出错\n原因是:' + str(error))
except TypeError as error:
    print('类型出错\n原因是:' + str(error))
except ValueError as error:
    print('数值出错\n原因是:' + str(error))
 
3、except中异常的捕获顺序也很重要,
 
KeyError是LookupError的子类,上面的例子有问题,正常按照从小到大顺序来,这样更精确
 
dict1 = {'a': 1, 'b': 2, 'v': 22}
try:
    x = dict1['y']
except LookupError as  e:
    print('查询错误',str(e))
except KeyError:
    print('键错误')
else:
    print(x)
 
输出: 查询错误 'y'
 
dict1 = {'a': 1, 'b': 2, 'v': 22}
try:
    x = dict1['y']
except KeyError as keyerror:
    print('键错误',str(keyerror))
except LookupError:
    print('查询错误')
else:
    print(x)
输出: 键错误 'y
 
4、except可以一次性捕获多个异常错误,以元组的形式
 
try:
    s = 1 + '1'
    int("abc")
    f = open('test.txt')
    print(f.read())
    f.close()
except (OSError, TypeError, ValueError) as error:
    print('出错了!\n原因是:' + str(error))
 
5、try-except-finally形式
 
def divide(x, y):
    try:
        result = x / y
        print("result is", result)
    except ZeroDivisionError:
        print("division by zero!")
    finally:
        print("executing finally clause")

divide(2,1)
# result is 2.0
# executing finally clause
divide(2,0)
# division by zero!
# executing finally clause
divide("2","1")
# executing finally clause,没有被except捕获,但是也会执行到finally中,
# TypeError: unsupported operand type(s) for /: 'str' and 'str'
 
6、try-except-else形式
只有try中成功执行,才会执行else。
try:
    fh = open("testfile.txt", "w")
    fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
    print("Error: 没有找到文件或读取文件失败")
else:
    print("内容写入文件成功")
    fh.close()
#如果try代码执行成功,则会输出: 内容写入文件成功

7、raise抛出一个指定的异常,然后被捕获
try:
    raise NameError('HiThere')
except NameError:
    print('An exception flew by!')
# An exception flew by!