#像是直接print a 却没给a赋值 就会报错
#print(a)#异常就是在程序运行中不可避免的出现的错误
#程序在运行中一旦出现异常会立即终止
print('python')
try:
print (int(10 /1))
except:
print('报错')
else:
('对了')
print('java')
#我们发现第二条程序报错第三条程序不会执行
#处理异常:程序运行出现异常 目的不是为了终止程序 python希望出现异常的时候我们
#编写相应的代码来对异常进行处理
#语法:try: 代码块(可能出错的语句) except: 代码块(出现错误的处理)( else:代码块(没出错误的处理),finally:代码块 该代码块总会被执行
#异常的传播
#在函数中出现了异常 如果在函数中对异常进行了处理,则不会再传播 如果没有对异常进行处理 则异常会继续像函数调用处传播
# def fn():
# print('hello fn')
# print(6 / 0)
# try:
# fn()#我们可以在调用的时候处理异常
# except:
# pass
#这样调用函数就出现了二个异常
#当程序运行过程出现异常以后 所有的异常信息会保存在一个异常对象中而异常传播是 实际就是异常对象抛给了调用处
# def fn():
# print('hello fn')
# print(6 / 0)
# def fn2():
# print('hello fn2')
# fn()
# fn2()
#异常对象
try:
print(a)
print(6 /0)
python +6
#except NameError:
#如果except后面不跟任何类容则此时它会捕获到所有的异常
#如果跟要捕获异常的类型 则它只会捕获该类型的异常
# print('处理命名异常代码')
# except ZeroDivisionError:
# print('处理除零异常')
except Exception as e:#Excpeption是所有异常的父类 如果excpept后跟着是E会捕获所有异常
print('不晓得啥异常',e,type(e))
finally:
print('无论是否出现异常该代码块都会执行')
print('异常出现后')
#抛出异常使用raise语句
#raise语句后面需要跟一个异常类或异常类的实例
#也可以自己定义异常类 只需要创建一个类来继承Exception
class MyError(Exception):
pass
def fn(a,b):
#如果传进来参数有负数 那么就向调用处抛出异常
if a <0 or b <0:
raise MyError('自定义类型的类')
r = a + b
return r
print(fn(-1,2))