python如何获取文件的行号_Python当我捕获异常时,如何获取类型,文件和行号?...

 2023-09-08 阅读 26 评论 0

摘要:捕获一个将按如下方式打印的异常:Traceback (most recent call last):python read readline readlines。File"c:/tmp.py", line 1, in 4 / 0ZeroDivisionError: integer division or modulo by zeropython打开文件的路径。我想把它格式化为:ZeroDivison

捕获一个将按如下方式打印的异常:

Traceback (most recent call last):

python read readline readlines。File"c:/tmp.py", line 1, in

4 / 0

ZeroDivisionError: integer division or modulo by zero

python打开文件的路径。我想把它格式化为:

ZeroDivisonError, tmp.py, 1

使用内置的回溯模块。

python查看当前路径?如果出现异常,打印代码行也会有所帮助:请参阅stackoverflow.com/questions/14519177/…

import sys, os

try:

python获取文件列表、raise NotImplementedError("No error")

except Exception as e:

exc_type, exc_obj, exc_tb = sys.exc_info()

python获取路径下的所有文件名、fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]

print(exc_type, fname, exc_tb.tb_lineno)

您应该小心地将sys.exc_info()解包到局部变量中,因为如果在except处理程序中得到异常,则局部变量可以保存在循环引用中,而不是gc'd中。最佳做法是始终只使用sys.exc_info()的切片。或者像其他海报建议的那样使用其他模块,比如回溯。

肺结核只是不包括肺结核吗?和os.path.split(blabla)[1]是os.path.basename(balbalbal)

这条线安全吗?

用这个代码,我得到(当try: 1/0时):integer division or modulo by zero。如何让ZeroDivisionError: integer division or modulo by zero代替?

@basj:使用sys.exc_info()[0]。uu name_uuu,您可以得到类型的简单名称。

@DanielPryden python文档也使用相同的解包方法docs.python.org/2/library/traceback.html回溯示例

我正在从另一个文件导入类,使用此解决方案时,错误指向当前文件中调用该类函数的行。实际错误发生在类文件中,但此解决方案仅显示当前文件中的错误。有没有办法挖得更深?

@罗布:是的,它是安全的。为了解决以前API中的线程安全问题,引入了sys.exc_info()。它的输出特定于当前线程和当前堆栈帧。

如果使用日志库,则使用logging.exception(e)

这是一个很好的演示,演示了为什么在Python中所有简单的事情都比较困难……

simplest形式,为我工作。

import traceback

try:

print(4/0)

except ZeroDivisionError:

print(traceback.format_exc())

输出

Traceback (most recent call last):

File"/path/to/file.py", line 51, in

print(4/0)

ZeroDivisionError: division by zero

Process finished with exit code 0

虽然这不完全是OP想要的格式,但这是最简单、最可靠的解决方案。

它的强大之处是什么?

这正是我想要的。""稳健"。

源(Py v2.7.3)traceback.format _例外(所谓的)和/ helps greatly相关函数。embarrassingly,总是忘记读《源代码。在我对这只母狗在搜索类似徒劳的细节。一个简单的问题,"如何recreate相同的输出作为Python例外的情况一样,与所有的细节。"这会让任何人90 +百分之二,不管他们的寻找。时滞,和这是IP的实例。希望它helps他人。(它的酸性帮我!;-)

import sys, traceback

traceback_template = '''Traceback (most recent call last):

File"%(filename)s", line %(lineno)s, in %(name)s

%(type)s: %(message)s

''' # Skipping the"actual line" item

# Also note: we don't walk all the way through the frame stack in this example

# see hg.python.org/cpython/file/8dffb76faacc/Lib/traceback.py#l280

# (Imagine if the 1/0, below, were replaced by a call to test() which did 1/0.)

try:

1/0

except:

# http://docs.python.org/2/library/sys.html#sys.exc_info

exc_type, exc_value, exc_traceback = sys.exc_info() # most recent (if any) by default

'''

Reason this _can_ be bad: If an (unhandled) exception happens AFTER this,

or if we do not delete the labels on (not much) older versions of Py, the

reference we created can linger.

traceback.format_exc/print_exc do this very thing, BUT note this creates a

temp scope within the function.

'''

traceback_details = {

'filename': exc_traceback.tb_frame.f_code.co_filename,

'lineno'  : exc_traceback.tb_lineno,

'name'    : exc_traceback.tb_frame.f_code.co_name,

'type'    : exc_type.__name__,

'message' : exc_value.message, # or see traceback._some_str()

}

del(exc_type, exc_value, exc_traceback) # So we don't leave our local labels/objects dangling

# This still isn't"completely safe", though!

#"Best (recommended) practice: replace all exc_type, exc_value, exc_traceback

# with sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2]

print

print traceback.format_exc()

print

print traceback_template % traceback_details

print

在这个特定的查询答案:

sys.exc_info()[0].__name__, os.path.basename(sys.exc_info()[2].tb_frame.f_code.co_filename), sys.exc_info()[2].tb_lineno

PY3改'message' : exc_value.message为'message' : str(exc_value)。

这里是一个example of the Line number of表现例外在需要的地方。

import sys

try:

print(5/0)

except Exception as e:

print('Error on line {}'.format(sys.exc_info()[-1].tb_lineno), type(e).__name__, e)

print('And the rest of program continues')

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/19908.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息