当前位置: 首页 > 面试题库 >

向异常添加信息?

庞鸿骞
2023-03-14
问题内容

我想实现以下目标:

def foo():
   try:
       raise IOError('Stuff ')
   except:
       raise

def bar(arg1):
    try:
       foo()
    except Exception as e:
       e.message = e.message + 'happens at %s' % arg1
       raise

bar('arg1')



Traceback...
  IOError('Stuff Happens at arg1')

但是我得到的是:

Traceback..
  IOError('Stuff')

关于如何实现这一目标的任何线索?如何在Python 2和3中做到这一点?


问题答案:

我会这样做,因此更改它的类型foo()将不需要也将其更改bar()

def foo():
    try:
        raise IOError('Stuff')
    except:
        raise

def bar(arg1):
    try:
        foo()
    except Exception as e:
        raise type(e)(e.message + ' happens at %s' % arg1)

bar('arg1')
Traceback (most recent call last):
  File "test.py", line 13, in <module>
    bar('arg1')
  File "test.py", line 11, in bar
    raise type(e)(e.message + ' happens at %s' % arg1)
IOError: Stuff happens at arg1

更新1

这是保留原始回溯的略微修改:

...
def bar(arg1):
    try:
        foo()
    except Exception as e:
        import sys
        raise type(e), type(e)(e.message +
                               ' happens at %s' % arg1), sys.exc_info()[2]

bar('arg1')
Traceback (most recent call last):
  File "test.py", line 16, in <module>
    bar('arg1')
  File "test.py", line 11, in bar
    foo()
  File "test.py", line 5, in foo
    raise IOError('Stuff')
IOError: Stuff happens at arg1

更新2

对于Python 3.x,我的第一次更新中的代码在语法上是不正确的,并且在message2012BaseException年5月16日对PEP
352的更改中撤消了
启用属性的想法(我的第一次更新发布于2012-03-12) 。因此,当前,无论如何,在Python
3.5.2中,您都需要按照以下步骤进行操作以保留回溯,而不是硬编码function中的异常类型bar()。另请注意,将出现以下行:

During handling of the above exception, another exception occurred:

在显示的回溯消息中。

# for Python 3.x
...
def bar(arg1):
    try:
        foo()
    except Exception as e:
        import sys
        raise type(e)(str(e) +
                      ' happens at %s' % arg1).with_traceback(sys.exc_info()[2])

bar('arg1')

更新3

一个评论者询问是否有会在两个Python 2和3。工作虽然答案可能似乎是“不”,因为语法不同的方式,还有 就是
周围的一种方法,通过使用一个辅助函数一样reraise()six添加-
在模块上。因此,如果您出于某种原因不愿使用该库,则下面是简化的独立版本。

还要注意,由于异常是在reraise()函数中引发的,因此它将在引发任何回溯的情况下出现,但最终结果是您想要的。

import sys

if sys.version_info.major < 3:  # Python 2?
    # Using exec avoids a SyntaxError in Python 3.
    exec("""def reraise(exc_type, exc_value, exc_traceback=None):
                raise exc_type, exc_value, exc_traceback""")
else:
    def reraise(exc_type, exc_value, exc_traceback=None):
        if exc_value is None:
            exc_value = exc_type()
        if exc_value.__traceback__ is not exc_traceback:
            raise exc_value.with_traceback(exc_traceback)
        raise exc_value

def foo():
    try:
        raise IOError('Stuff')
    except:
        raise

def bar(arg1):
    try:
       foo()
    except Exception as e:
        reraise(type(e), type(e)(str(e) +
                                 ' happens at %s' % arg1), sys.exc_info()[2])

bar('arg1')


 类似资料:
  • 我有一个POJO类,用于使用Jackson进行反序列化。这个类包含所有类变量的默认构造函数、getter和setter方法<因为我需要一些关于POJO内容的高级逻辑,所以我添加了一个方法 但现在,我的单元测试在反序列化过程中失败,只有以下例外: 在我看来,Jackson似乎识别了一个get方法,并由此推断出,反序列化必须有一个类似的JSON属性 当我用@JsonIgnore注释方法时,测试成功了。

  • 各位开发者好, 我试图打开一个jmx连接到一个应用程序使用jVisualvm,但当我添加连接它失败与SecurityExcture。谁能帮我想出如何避免这种情况? 全堆栈跟踪 谢谢你的帮助。

  • 我在Eclipse中创建了四个相互依赖的库。当我将这些库添加到我的Android项目中时,我得到了下面的异常。在经历了一个排除的过程后,我发现是三个库中的一个导致了异常。 我在另一个Eclipse项目中成功地使用了这四个库,因此我认为它们没有任何问题,问题必须是特定于Android的。 我还将这些库添加到一个新的空白Android项目中,在那里它们工作得很好。 我对所讨论的库有哪些选择?我是一个接

  • Go 语言中提供了两种创建异常信息的方式 方式一:通过 fmt 包中的 Errorf 函数创建错误信息,然后打印 package main import "fmt" func main() { // 1.创建错误信息 var err error = fmt.Errorf("这里是错误信息") // 2.打印错误信息 fmt.Println(err) // 这里是错误信息 }

  • 我正在使用OpenSSL生成证书签名请求(CSR)。 但是,我希望将自己的字段添加到证书中,例如: GroupID:348348923 EmployeeLevel:Class 3 在我请求证书颁发机构(CA)签署CSR之前,正确的方法是什么?