一、系统常见的异常
你必须先知道有那些异常,到时候遇到的时候才不会惊慌。
1.除0异常 ZeroDivisionError
出现情况: 1 / 0
结果: ZeroDivisionError: division by zero
2.名称异常 NameError
出现情况: print(name)
结果:NameError: name 'name' is not defined
3.类型异常 TypeError
出现情况: print('1' + 2)
结果:TypeError: can only concatenate str (not "int") to str
4.索引异常 IndexError
出现情况:
l = [1, 2]
l[3]
结果:IndexError: list index out of range
5.键异常 KeyError
出现情况:
dict = {"name": "子木"}
dict["lz"]
结果:KeyError: 'lz'
6.值异常异常 ValueError
出现情况:
int('abc')
结果:ValueError: invalid literal for int() with base 10: 'abc'
7.属性异常 AttributeError
出现情况:
class Person(object):
pass
p = Person()
print(p.name)
结果:AttributeError: 'Person' object has no attribute 'name'
8.迭代器异常 StopIteration
出现情况:
it = iter([1, 2])
print(next(it))
print(next(it))
print(next(it))
结果:StopIteration
总结 :系统异常继承树结构 特定异常 --> Exception -- > BaseException -- > object
二、异常处理
方案一:
try:
print("可能出现异常的代码")
print(name)
except (NameError, ZeroDivisionError) as error_domin:
print('捕捉异常类型-NameError',error_domin)
except ValueError as renson:
print("捕捉异常类型-ValueError",renson)
except Exception as renson:
print("捕捉异常类型-Exception", renson)
else:
print("没有异常执行代码")
finally:
print("不管有没有异常都要执行的代码")
方案二:
# with 预处理A 处理完成之后执行清理操作
# with context[as **arg]: 1、 __enter__ 方法进入 2、执行与具体body 3、__exit__方法退出
# with.body
import traceback
class custom_context(object):
def __enter__(self):
print("enter")
return self
# 退出时候参数都是异常信息 和 追踪信息 如果返回true 异常不会传出去 返回false 异常会传出去
# 这里可以把异常写入日志
def __exit__(self, exc_type, exc_val, exc_tb):
print(self, exc_type, exc_val, exc_tb)
print("exit")
print(traceback.extract_tb(exc_tb))
return True
# context 是 __enter__ 返回的对象
with custom_context() as context:
print("主体代码", context)
2.手动抛出异常
def set_age(age):
if age <= 0 or age > 100:
raise ValueError("设置年龄不对") # 手动抛出异常
else:
print("设置张三的年龄是", age)
set_age(18)
set_age(-18)
3.自定义异常
class CustomException(Exception):
def __init__(self, message, error_code):
self.message = message
self.errorCode = error_code
def __str__(self):
return "自定义异常类的信息:{} 错误码:{}".format(self.message, self.errorCode)
def set_age(age):
if age <= 0 or age > 100:
raise CustomException("设置年龄不对", 404)
else:
print("设置张三的年龄是", age)
try:
set_age(-18)
except Exception as e:
print(e)
最后赠言
学无止境,学习Python的伙伴可以多多交流。