您现在的位置是:主页 > news > 如何在百度做自己公司的网站/上海搜索排名优化公司
如何在百度做自己公司的网站/上海搜索排名优化公司
admin2025/4/28 8:44:21【news】
简介如何在百度做自己公司的网站,上海搜索排名优化公司,企业网站建设教程视频,有没有做任务的网站Traceback抛出详细错误信息 1.概述 在python默认的抛出异常错误信息中给出的提示很少时不利于定位问题原因,需要一个详细的信息辅助定位问题,使用Traceback模块可以打印出详细的信息,下面来介绍如何使用这个模块。 2.Traceback模块 2.1.T…
Traceback抛出详细错误信息
1.概述
在python默认的抛出异常错误信息中给出的提示很少时不利于定位问题原因,需要一个详细的信息辅助定位问题,使用Traceback模块可以打印出详细的信息,下面来介绍如何使用这个模块。
2.Traceback模块
2.1.Traceback获取信息
在介绍Traceback模块前,先看一个python标准输出异常信息示例。在示例代码中定义了一个foo1函数,该函数抛出一个异常信息,main函数调用foo1函数时将异常输出。
def foo1():raise Exception("--foo1 exception--")def main():try:foo1()except Exception as e:print eif __name__ == '__main__':main()
运行代码查看它的输出结果
--foo1 exception--
示例中输出的错误信息非常的少,下面来看下如何获取更多的信息。
Traceback获取信息是通过函数sys.exc_info()来获取的,先来看一个例子。
import sysdef foo1():raise NameError("--foo1 exception--")def main():try:foo1()except Exception as e:exc_type, exc_value, exc_traceback_obj = sys.exc_info()print "exc_type: %s" % exc_typeprint "exc_value: %s" % exc_valueprint "exc_traceback_obj: %s" % exc_traceback_objif __name__ == '__main__':main()
运行查看结果
exc_type: <type 'exceptions.NameError'>
exc_value: --foo1 exception--
exc_traceback_obj: <traceback object at 0x879ddf5dji89>
sys.exc_info()获取了当前处理的exception的相关信息,并返回一个元组:
- 第一个数据是异常的类型(示例是NameError类型)
- 第二个返回值是异常的value值
- 第三个就是我们要的traceback object
有了traceback object我们就可以通过traceback来打印和格式化traceback的相关信息,下面我们就来看下traceback的相关函数
2.2.Traceback常用函数
1.print_tb
import sys
import tracebackdef foo1():raise NameError("--foo1 exception--")def main():try:foo1()except Exception as e:exc_type, exc_value, exc_traceback_obj = sys.exc_info()traceback.print_tb(exc_traceback_obj)if __name__ == '__main__':main()
运行查看结果
File "<ipython-input-23-52bdf2c9489c>", line 11, in mainfoo1()
File "<ipython-input-23-52bdf2c9489c>", line 6, in foo1raise NameError("--func1 exception--")
下面我们了解下print_tb函数详细信息
traceback.print_tb(tb[, limit[, file]])
- tb: 这个就是traceback object, 是我们通过sys.exc_info获取到的
- limit: 这个是限制stack trace层级的,如果不设或者为None,就会打印所有层级的stack trace
- file: 这个是设置打印的输出流的,可以为文件,也可以是stdout之类的file-like object。如果不设或为None,则输出到sys.stdout。
2.print_exception
import sys
import tracebackdef foo1():raise NameError("--func1 exception--")def foo2():func1()def main():try:foo2()except Exception as e:exc_type, exc_value, exc_traceback_obj = sys.exc_info()traceback.print_exception(exc_type, exc_value, exc_traceback_obj, limit=2, file=sys.stdout)if __name__ == '__main__':main()
运行结果
Traceback (most recent call last):File "<ipython-input-24-a68061acf52f>", line 13, in mainfoo2()File "<ipython-input-24-a68061acf52f>", line 9, in foo2foo1()
NameError: --foo1 exception--
print_exception函数介绍
traceback.print_exception(etype, value, tb[, limit[, file]])
跟print_tb相比多了两个参数etype和value,分别是exception type和exception value,加上tb(traceback object),正好是sys.exc_info()返回的三个值
与print_tb相比,打印信息多了开头的"Traceback (most…)“信息以及最后一行的异常类型和value信息
还有一个不同是当异常为SyntaxError时,会有”^"来指示语法错误的位置
3.print_exc
print_exc是简化版的print_exception, 由于exception type, value和traceback object都可以通过sys.exc_info()获取,因此print_exc()就自动执行exc_info()来帮助获取这三个参数了,也因此这个函数是我们的程序中最常用的,因为它足够简单
import sys
import tracebackdef foo1():raise NameError("--func1 exception--")def foo2():func1()def main():try:foo2()except Exception as e:exc_type, exc_value, exc_traceback_obj = sys.exc_info()traceback.print_exc(limit=1, file=sys.stdout)if __name__ == '__main__':main()
运行结果
Traceback (most recent call last):File "<ipython-input-25-a1f5c73b97c4>", line 13, in mainfoo2()
NameError: --foo1 exception--
4.format_exc
format_exc函数与print_exc函数功能是一样的,他们唯一的区别不是通过print打印异常信息,而是将异常信息记录到日志中。
import sys
import tracebackdef foo1():raise NameError("--func1 exception--")def foo2():func1()def main():try:foo2()except Exception as e:exc_type, exc_value, exc_traceback_obj = sys.exc_info()# 通过logger将异常信息记录到日志logger.error(traceback.format_exc(limit=1, file=sys.stdout))# 或者用下面的方式将异常信息封装成通用格式logger.error(f'输出失败异常:{e.__dict__},traceback={traceback.format_exc()}')if __name__ == '__main__':main()
2.3.获取线程中的异常信息
在多线程运行模式下,无法将多线程中的异常带回主线程,所以也就无法打印线程中的异常但是可以通过Traceback实现捕获线程异常
import threading
import tracebackdef my_func():raise BaseException("thread exception")class ExceptionThread(threading.Thread):def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, verbose=None):"""Redirect exceptions of thread to an exception handler."""threading.Thread.__init__(self, group, target, name, args, kwargs, verbose)if kwargs is None:kwargs = {}self._target = targetself._args = argsself._kwargs = kwargsself._exc = Nonedef run(self):try:if self._target:self._target()except BaseException as e:import sysself._exc = sys.exc_info()finally:#Avoid a refcycle if the thread is running a function with#an argument that has a member that points to the thread.del self._target, self._args, self._kwargsdef join(self):threading.Thread.join(self)if self._exc:msg = "Thread '%s' threw an exception: %s" % (self.getName(), self._exc[1])new_exc = Exception(msg)raise new_exc.__class__, new_exc, self._exc[2]t = ExceptionThread(target=my_func, name='my_thread')
t.start()
try:t.join()
except:traceback.print_exc()
运行结果
Traceback (most recent call last):File "/data/code/testcode/thread_exc.py", line 43, in <module>t.join()File "/data/code/testcode/thread_exc.py", line 23, in runself._target()File "/data/code/testcode/thread_exc.py", line 5, in my_funcraise BaseException("thread exception")
Exception: Thread 'my_thread' threw an exception: thread exception