异常处理

names = ['alex','jack']

#尝试(try) 执行names[3]这段代码;除非(except) 出了IndexError这个错,e 是错误种类的详细信息;注意try外的代码错误,except不能捕获到;
try:
names[3]
except (IndexError) as e :
print("没有这个索引",e)
--------------------------------------------------------------------------------
names = ['alex','jack']
data = {}
try:
# names[3]
data['ssss'] #try下只要有一个报错了,try中这个报错后面的代码都不执行,就跳转到except 中匹配错误
#也就是说data['ssss']这行报错了,就跳转到下面的except来匹配对应KeyError的错误,open("tes.txt")这行就不执行了
open("tes.txt")

except (KeyError,IndexError) as e : #匹配到KeyError和IndexError统一处理可以这样写
print("没有这个key",e)
except IndexError as e :
print("列表操作错误",e)
except Exception as e: #Exception 抓住所有错误,但是不包含 代码没有正确对齐(IndentationError )、语法错误(SyntaxError)
#因为这样的错误会导致代码不能往下面执行(这行报错后面的代码都执行不了了),编译都编译不;
print("未知错误",e)
else: #如果上面列的所有错误种类都没有匹配到,执行这个
print("一切正常")
finally: #不管try中代码有没有错误,都执行
print("不管有没有错,都执行")

--------------------------------------------------------------------------------
自定义异常:
class AlexError(Exception):
def __init__(self, msg):
self.message = msg

# __str__方法默认可以不写,默认print实例,输出的是实例初始化时,传递的值(也就是这里的msg参数的值);如果写了__str__就是重构Exception中的 __str__了
# def __str__(self):
# return 'sdfsf'
try:
raise AlexError('数据库连不上') # 触发(raise) AlexError这个种类的错误,自定义异常需要自己触发,那些except抓取只能抓python标准的报错
except AlexError as e:
print(e)

--------------------------------------------------------------------------------
自定义异常不要和Python内置的异常名称一样:

class IndexError(Exception):        #自定义IndexError错误
def __init__(self,mes):
self.message = mes
names = []

try:
names[9]

except IndexError as e: #这行会接收不到异常,代码崩溃 #except IndexError 这个调用的是自己定义的异常;
print(e)



自己定义的异常IndexError与Python内置的IndexError这个异常名称重复;
except IndexError 这个调用的是自己定义的异常;
这个except IndexError 只能捕获触发自己的IndexError的异常;Python标准的IndexError这个异常捕获不到;
自己定义的IndexError,错误信息是__main__.IndexError,代表本程序自己的IndexError;
Python内置的IndexError的错误信息是IndexError



测试代码如下:

print(id(IndexError))   #python 标准错误IndexError的内存地址
C = IndexError

class IndexError(Exception):
def __init__(self,mes):
self.message = mes
print(id(IndexError)) #自定义错误IndexError的内存地址
names = []
# C = IndexError #这行注释,这个代码就不报错,不注释,就报错
print(id(C),id(IndexError))
try:
names[9]

except C as e:
print(id(C))
print(id(IndexError))
print(e)


#-------------------------------------------------------------------------------
traceback.print_exc()   # 显示报错在哪一行

参考:
http://www.cnblogs.com/wupeiqi/articles/5017742.html
原文地址:https://www.cnblogs.com/lighthouse/p/9685094.html