python学习之异常学习

python中常见的异常类型
1. NameError:尝试访问一个为申明的变量。
2. ZeroDivisionError:除数为零错误。
3. SyntaxError:解释器语法错误,这是一个唯一不在运行时发生的异常,在运行前解释器就会显示其错误。
4. IndexError:请求的索引超出范围。
5. KeyError:请求一个不存在的字典的关键字。
6. IOError:输入/输出错误(IO错误)。
7. AttributeError:尝试访问未知的对象属性。
8. TypeError:类型错误,参数等类型不匹配。
9. Exception:捕获所有异常。
python检测和处理异常

异常处理使用主要有两个语句

try:
    pass
except 错误类型 as e:
    print(e)
    pass
    
try:
    pass
finally:
	pass
注意
  1. try中的代码发生错误抛出异常,except根据自己的异常类型判断是否捕获这个异常。一个try可以跟多个except。和C++类似,Exception异常类型可以捕获除了sys.exit()抛出的程序退出类型以外的任何异常类型。as e是产生一个异常类型的对象,然后print(e)会打印出异常类型信息。
  2. 如果try中代码未发生异常,就会跳过。如果try中出现异常,但是except的异常类型与异常不匹配,那么程序就会在异常语句直接挂掉
  3. try-finally子句,finally子句只能有一个,也可以使用try-except-finally混合语句。finally的语句无论错误是否发生都会被执行。如果是混合的话finally写在最后。
  4. 也可以指定确定的异常类型,因为一般代码中不同的异常可能补救处理不同,使用try和多个except即可。
  5. 如果对于某个类型异常你不想做处理,你可以在其except代码块中写pass即可,但是程序会报错。
异常处理中else关键字
try:
    pass
except TypeError:
    print("类型错误")
else:
    print("else子句")
finally:
    print("finally子句")
  • 一个try-except-finally语句中只能有一个else,并且else必须在except后面,如果没有异常发生,也就是没有执行except那就会执行else,else必须放在except和finally中间。
异常语句可以跨层次

下一个简单的代码来说明

def func(s):
    return 10 / int(s)

def help(s):
    return func(s) * 10

def main():
    try:
        help('0')
    except Exception as e:
        print(e)
    finally:
        print("finally")

main()

""" 结果:
division by zero
finally
"""

上面的代码就实现了跨层次的捕获异常,首先func将异常抛给help然后help将异常抛给main,然后main处理异常。

主动触发异常

raise语句就是用来出动主动抛出异常的,类似于C++的throw一样,使用格式如下:

def div(a,b): # 做a/b
    if b == 0:
        raise ZeroDivisionError("division by error")
    return a / b
自定义异常类型

自己实现一个类,然后需要继承Expection类。

class MyError(Exception):
    def __init__(self,msg):
        self.mymsg = msg

    # 重载print函数
    def __str__(self):
        return self.mymsg

try:
    raise MyError("my error")
except MyError:
    print("MyError")
断言

和C中的assert一样,如果assert子句条件不成立就会抛出AssertionError类型的异常。否则就不做任何事。

a = 12
b = 0
assert b != 0,"division by zero"
tmp = a / b
print("end")


a=12
b=0
try:
    assert b != 0,"division by zero"
    tmp = a /b
except AssertionError as a:
    print(a)

第一种代码程序会崩溃,并打印字符串;第二种也可以直接捕获异常。