说在前面
我觉得没有什么错误是调试器无法解决的,如果没有,那我再说一遍,如果有,那当我没说
一、抛出异常
可以通过 raise 语句抛出异常,使程序在我们已经知道的缺陷处停下,并进入到 except 语句
raise句法:
raise关键字
调用的异常函数名 ValueError (这个函数必须是异常类或一个实例)
传递给 ValueError 的字符串,包含有用的出错信息
>>> raise ValueError('This is a error message')
Traceback (most recent call last):
File "<pyshell#24>", line 1, in <module>
raise ValueError('This is a error message')
ValueError: This is a error message
然后使用 try…except 语句来对抛出的异常做处理
通常我们在函数本身中抛出异常,然后在调用该函数的地方使用 try…except 语句处理异常
在学习过程中有什么不懂得可以加我的
python学习扣扣qun,784758214
群里有不错的学习视频教程、开发工具与电子书籍。
与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容
#定义一个简单的int类型的加法器
def calculator(num1,num2):
if isintance(num1,int)and isintance(num2,int):
raise Exception('Symbol must be a int type number.')
return num1+num2
print('please enter two number:')
num1=input()
num2=input()
#在调用函数的地方使用try语句
try:
print(calculator(num1,num2))
except Exception as err:
print('发生了一个错误:'+str(err))
#另一种使用情况
try:
print(key)
return self[key]
except KeyError:#如果在上面遇见了keyError
raise AttributeError(r"'%s' don't have attribute '%s'"%#就抛出这个AttributeError类型的错误,顺序别弄错<br>(self.__class__.name,key))
注意上面的 as 语句取得 str ,如果不取也是可以的
运行示例:
RESTART: C:/Users/Administrator.SC-201605202132/AppData/Local/Programs/Python/Python37/boxPrint.py
please enter two number:
s
发生了一个错误:name 'isintance' is not defined
>>>
二、取的反向跟踪的字符串
当程序运行出现错误时,python会生成一些错误信息,这些错误信息被称为“反向跟踪”,它包含了出错信息、导致该错误的代码行号,和导致 该错误的函数调用 的 序列,这个序列被称为调用栈。
只要抛出的异常没有被处理,python就会显示反向跟踪
以下面程序来展示我们对反向跟踪的解读
def spam():
bacon()
def bacon():
raise Exception('This is the error message')
spam()
这就是反向跟踪:
Traceback (most recent call last):
File "C:/Users/Administrator.SC-201605202132/AppData/Local/Programs/Python/Python37/errorExample.py", line 6, in <module>
spam()
File "C:/Users/Administrator.SC-201605202132/AppData/Local/Programs/Python/Python37/errorExample.py", line 2, in spam
bacon()
File "C:/Users/Administrator.SC-201605202132/AppData/Local/Programs/Python/Python37/errorExample.py", line 4, in bacon
raise Exception('This is the error message')
Exception: This is the error message
我们应该从下往上阅读方向跟踪,通过反向跟踪我们可以知道,这个错误发生在第5行,在bacon函数中;这次特定的bacon调用发生在第2行,spam函数中,而spam函数又是在第6行被调用的。这样,在从多个位置调用函数的程序中,调用栈就能帮助你确定那次调用导致了错误。
调用 traceback.format_exc() 得到反向跟踪的字符串形式
前面说过,如果抛出的异常没有被处理,python才会显示反向跟踪。假如我们既想用except处理错误,又想要获得出错信息,就可以用这个函数,需要导入 traceback 模块
例如,我们可以在程序出现错误时还能继续运行,同时把错误信息记录到日志中。在程序结束后调试程序时,我们就根据日志里记录的信息去调试
>>> import traceback
>>> try:
raise Exception('This is a error message')
except:
errorFile=open('errorInfo.txt','w')
errorFile.write(traceback.format_exc()) #使用tracback.format_exc()获得反向跟踪的字符串形式
errorFile.close()
print('The traceback info was written to errorInfo.txt')
112 #返回的是写入的字符个数
The traceback info was written to er