使python在try块中出现错误后不撤消操作

2024-06-26 21:27:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python类,在其中我打开文件并读取数据。如果不满足某些条件,我将引发一个错误,但在此之前,我通过给对象一个属性来指定错误:self.Error = specification。但是由于错误引发会撤消try块中的所有内容,因此我无法访问它。这发生在__init__函数中,因此创建的对象甚至不存在

以下是必要的代码:

class MyClass:
    def __init__(self):
        #do something
        if this_or_that:
            self.Error = specification
            raise MyCostumError
try:
    object = MyClass()
except MyCostumError:
    print(object.Error)

我得到:NameError: name 'object' is not defined

请澄清: 我已经定义了MyCostumError,变量名只是为了更好地理解:我使用了好的名称,它们已经定义好了,我需要澄清,因为在不同的行中可能会出现错误

所以我的问题是: 是否存在类似try/except的情况,但当出现错误时,它不会撤消所有操作。或者我只是愚蠢,有一个更简单的方法来实现这一点


Tags: 文件对象self定义objectinit错误myclass
3条回答

如果在初始值设定项中引发异常,则不应依赖要创建的对象向调用方获取一些错误信息。这是您应该使用异常传递该信息的地方:

class MyCustomError(Exception):
    pass

class MyClass:
    def __init__(self):
        #do something
        if this_or_that:
            raise MyCustomError(specification)  # put the spec in the exception itself
try:
    object = MyClass()
except MyCustomError as e:
    print(e)  # the spec is in the exception object

您正试图引用一个不存在的对象。让我解释一下: 如果在尝试初始化对象时发生错误,则不会初始化该对象。因此,如果您试图在它未初始化时访问它,您将得到一个错误

try:
    object = MyClass() #initialising object successful, object existing.
except: #initialising failed, object does not exist.
    print(object.Error) #nameError, since object was never created.

Try/except不会撤消任何操作,只是在发生错误时停止执行某些操作

错误引发不会撤消任何操作。请看一下docs

正如您的输出所述,object is not defined,这是因为当您在__init__中引发错误时,它被视为类的initialosor失败,并且不会返回对象


我想这就是你想要的:

class MyClass:

    def __init__(self):
        # do initialisation stuff

    def other_method(self):
        # do something
        if this_or_that:
            self.Error = specification
            raise MyCustomError(specification)  


object = MyClass()

try:
   object.other_method()
except MyCustomError as e:
    print(e)  

print(object.Error)

相关问题 更多 >