异常处理

异常处理:获得原谅比获得许可更容易

try:
可能发生异常的代码
except:
异常处理代码
except:处理所有异常
except Type:处理指定类型的异常
except Type as data: 获取异常信息
except (Type|Type2|Type3):同时处理这三种异常,如果想获取异常数据,同样可以使用as语句

try:
    opt = int(input('请输入一个整数'))
except (ValueError,KeyError):
    print('error')
else:
    print('没有发生异常')

定义下面这种方式捕捉异常时,一定要先写具体的异常,再写具有普遍性的异常,所有的异常,继承自Exception,最后再用Exception捕捉

try:
pass
except 异常类型1:
pass
except 异常类型2:
pass
except (异常类型3|异常类型4|异常类型5):
pass
except Exception as e:
print(e)

不管有没有发生异常都执行finally后的语句
可以只有try,finally语句
finally一般用来释放资源

try:
pass
except:
发生异常执行
else:
没有发生异常执行
finally:
不管有没有发生异常都执行

对一些普遍的异常进行处理,如果都不是最后用Exception捕捉,打印出来

try:
    num=int(input('请输入整数'))
    result=8/num
    print(result)
except ValueError:
    print('请输入一个整数')
except ZeroDivisionError:
    print('除数不能为0')
except Exception as e:
    print('未知错误%s'%e)
else:
    print('执行正确')
finally:
    print('执行结束')

异常的传递:异常发生后,会传递给方法(函数)的调用者A 有捕捉到该异常,则按捕捉机制处理
如果A没有捕捉该异常,则会层层向上传递
最终会传递给python解析器,此处就简单的终止程序

def fun1():
    a=int(input('输入整数'))
    print(10/a)

def fun2():
    try:
        fun1()
    except ZeroDivisionError: 
        #fun1的异常会向上传递到fun2处,被fun2捕捉           
        print('除数为0')          
fun2()

手动抛出异常 raise

def fun3():
    print('hello')
    raise ZeroDivisionError()
fun3()

自定义异常

class ParamInvalidException(Exception):
    def __init__(self,code,msg):
        self.code=code
        self.msg=msg
def login(username,pwd):
    if len(username)<6:
        raise ParamInvalidException(2000,'用户名长度在6-9之间')
    if username!='zhangsan':
        raise ParamInvalidException(2001,'用户名错误')
    print('登陆成功')

try:
    login('lisi','123456')
    print('后续操作')
except ParamInvalidException as e:
    print(e.code)

程序发生异常了怎么办?
是否是可控的?不可控的话,不管他
可控的异常,进行处理
不管是否可控,都先记录一下

try:
pass
except Exception:
#先记录异常
#能处理就处理
#不能处理就raise

你可能感兴趣的:(异常处理)