gpt4 book ai didi

python: raise ("customException") - 为什么没有堆栈跟踪?

转载 作者:太空宇宙 更新时间:2023-11-04 01:20:46 25 4
gpt4 key购买 nike

在 python (v2.7.3) 中使用自定义异常:调用 getSub() 时不获取堆栈跟踪,而 getSub(True) 调用一个,不同之处在于它是通过额外的尝试引起的...除了我想避免(+感觉没必要)那么为什么/如何避免呢?

import sys, traceback

class customException(Exception):
def __init__(self, *args):
super(customException,self).__init__(*args)
print "Stack trace within exception", traceback.extract_tb(sys.exc_info()[2])
errTxt = [a for a in args]
print "error text", errTxt

def getFn():
try:
getSub()
except customException as e:
print "customException was raised"
try:
getSub(True)
except customException as e:
print "customException2 was raised"

def getSub(flag=False):
if flag:
try:
1/0
except:
raise customException('test')
else:
raise customException('test')

getFn()

输出:

Stack trace within exception []
error text ['test']
customException was raised
Stack trace within exception [('./test3.py', 25, 'getSub', '1/0')]
error text ['test']
customException2 was raised

为了将上面的内容放在上下文中,我有以下几行代码(伪),直到我将代码归结为上面的示例,我才意识到为什么回溯访问并不总是有效。自定义异常类的目的是收集异常的总计数,以便对每个 do_something 的结果进行下游分类,例如致命、警告等。回溯的使用是从“引发”异常的位置记录,因此异常的创建(1/0 = 尽管看起来不合适)使它能够工作。想知道如何使用检查模块而不是在回溯堆栈中考虑这个问题?

__main__
With each item in set:
Try:
do_something(item)
except customException()
clean up = log info etc.
end With
end.__main__

do_something(item)
try:
check_something()
except customException
if exception=typeA.1 raise customException(Type1)
if exception=typeB.2 and item = ‘x’
raise customException(Type2)

check_something()
a = getInfo()
unless getInfo()
raise customException(typeA.1)
try:
b = getOtherInfo()
except customException
raise customException(typeB.2)

最佳答案

如果我没理解错的话,你想知道为什么你的 print "Stack trace within exception" 行为 getSub() 打印了一个空列表,但打印了一些回溯getSub(True) 的信息。

您的异常类的 __init__ 中有代码可以通过 sys.exc_info 查看最近的异常。当您执行 raise customException('test') 时,customException('test') 在它“知道”将要引发之前首先自行评估作为异常(exception)。因此,当您在 getSub() 中进行加注时,不会出现最近的异常。

使用 getSub(True) 时,有一个最近的异常,因为 1/0 在您创建 customException 之前引发了一个异常.请注意,当您执行 1/0 时,最近的异常是来自该 1/0 的异常;您可以看到该回溯中没有关于您的 customException 的信息。

在引发异常之前必须创建一个异常对象。因此,您不能查看异常类的 __init__ 中的“当前异常”来获取有关堆栈跟踪的信息,在引发时创建,因为它还没有那时还没有长大。

如果需要,您可以使用 traceback.extract_stack 来获取创建异常对象时的调用堆栈,但不能保证这与引发异常的时间有任何关系.仅仅因为创建了异常类的实例并不意味着它会被引发。仅使用 stuff = customException('blah') 创建异常对象但从未真正引发异常是完全合法的(尽管通常毫无意义)。

无论如何,从您的问题中并不清楚您要在此处实现的目标。如果您对此进行解释,将会有所帮助。

关于python: raise ("customException") - 为什么没有堆栈跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21414472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com