Python如何输出异常信息(行号)
作者:柳鲲鹏
这篇文章主要介绍了Python如何输出异常信息(行号)问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
Python输出异常信息
如下:
import traceback try: except Exception, e: print sys._getframe().f_lineno, 'str(e):\t\t', str(e) print sys._getframe().f_lineno, 'repr(e):\t', repr(e) print sys._getframe().f_lineno, 'e.message:\t', e.message print sys._getframe().f_lineno, 'traceback.print_exc():'; traceback.print_exc() print sys._getframe().f_lineno, 'traceback.format_exc():\n%s' % traceback.format_exc() # 关键是这一句 traceback.print_exc()
python代码测试中输出错误信息
python输出错误信息的方法
1、try -except + raise
最为常见的捕捉错误信息形式,其中有try - except, try - except-finally, raise格式
(1)try-except:
语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理,如果你不想在异常发生时结束你的程序,只需在try里捕获它。
try: self.cursor.execute(select_plan_info_sql, params) for x in self.cursor.fetchall(): plan.append({ }) except DatabaseError as ex: app_log.error("database error: %s, sql: %s, traceback: %s", ex, self.cursor.statement, traceback.format_exc())
(2)try-finally + try-except-finally:
finally 语句无论是否发生异常都将执行最后的代码。
try: f1 = open("test.txt","rU") for i in f1: i=i.strip() print(i) except Exception as E_results: print("捕捉有异常:",E_results) finally: #finally的代码是肯定执行的,不管是否有异常,但是finally语块是可选的。 f1.close print("我不管,我肯定要执行。")
(3)raise(抛出错误)
我们也可以自己定义错误类型,遇到自认为是错误情况时,抛出错误实例。用raise语句可以将一个错误实例抛出。
# 实例1 def fn(s): n = s if n == 0: raise MyError('invalid value: %s' % s) return 9 / n fn(0) # 实例2 try: self.cursor.execute(select_plan_info_sql, params) for x in self.cursor.fetchall(): plan.append({ }) except DatabaseError as ex: app_log.error("database error: %s, sql: %s, traceback: %s", ex, self.cursor.statement, traceback.format_exc()) raise HTTPError(500)
raise 和 try 的区别:
- raise语句负责抛出错误信息,而try语句负责检查是否有错误信息并捕获信息。
- 若没有try语句,那么错误信息就要让python的解释器来处理。
raise可以转换错误类型:
- raise语句也可以不带参数,此时按原错误信息抛出。
- 此外,在except中raise一个Error,还可以把一种类型的错误转化成另一种类型
try: 10 / 0 except ZeroDivisionError: raise ValueError('input error!')
2、self参数
在Python类中规定,函数的第一个参数是实例对象本身,并且约定俗成,把其名字写为self。其作用相当于java中的this,表示当前类的对象,可以调用当前类中的属性和方法。
self中存在一个self.fail方法,即当输入的情况不符合时,将会使用self.fail(message=u"message")
注:u是unicode格式,表示有中文字符时候将自动转换成中文,否则将以unicode形式输出
def put(self): app_id = self.get_argument("app_id").strip() if not app_id: self.fail(message="Invalid app_id") self.cache.sadd(settings.ALLOWED_APPS_KEY, app_id) self.success()
3、return tuple
当在测试中有多个情况多个值,并且在另一个方法中调用这些情况的时候,可以考虑使用这种方法,减少代码量
def int_cond_judge(temp_para, para, list_num): if list_num is None: list_num = [] if not temp_para: return None, "{} is empty".format(para) if isinstance(temp_para, (unicode, str)) and not temp_para.isdigit(): return None, "{} format is wrong".format(para) temp_para = int(temp_para) if list_num and temp_para not in list_num: return None, "{} is out of range".format(para) return temp_para, None # 上一步中各个情况的return返回值为tuple def return_value(self, temp_para, para, list_num=None): value, msg = int_cond_judge(temp_para, para, list_num) if msg: self.fail(message=msg) return value
4、list里面加入错误信息
(函数内部引用加值)
5、断言
这个方法一般使用在测试中,
self.assertEqual(a, b),如果a和b不相等(输出为false),则自动抛出异常
# list json_list = requests.get(self.url_list, self.params).json() self.assertEqual(json_list['status'], 0)
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。