在Python中引发用户定义的异常,该异常仅在条件满足时终止程序

2024-10-03 09:15:18 发布

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

我有一个模块定义了一个从Exception继承的类。我和组织中的其他人广泛使用此模块,现在可以清楚地看到,对于某些定义良好的条件,当引发异常时,程序发出警告并继续执行而不是终止执行是合适的

希望而不是要求所有用户在允许继续执行时使用此异常管理的所有位置添加try-except子句。条件在引发时传递给异常

下面是一个我正在尝试做的简单示例

class ConditionalException(Exception):
  def __init__(self,condition):
    self.condition=condition
    pass

  def __str__(self):
    return 'Condition: {}'.format(self.condition)


def raiseConditionalException():
  condition=0
  raise ConditionalException(condition) # should just give warning and continue execution

  condition=1
  raise ConditionalException(condition) # should be fatal

  condition=2
  raise ConditionalException(condition) # should never reach this point


raiseConditionalException()

这是可能的,还是完全违背了引发异常并要求用户在处理异常时显式的原则

我试图查看Exception和BaseException类定义(https://docs.python.org/3/library/exceptions.html),但我无法准确识别引发异常时会发生什么(例如,Exception内置类的哪些内部方法可以在用户定义的异常中修改)

谢谢大家!

编辑

我应该提到,如果可以从不同的类继承,比如Warning(尽管我认为Warning也从BaseException继承,所以我不确定如何使发出警告不致命),并实现相同的预期结果,那么也没关系。我尝试从Warning继承,但它的行为仍然像我从Exception继承的一样

一个有趣的细节是当我键入help(Exception)时,它说的第一件事是

class Exception(BaseException)
 |  Common base class for all non-exit exceptions.
 |
 |  Method resolution order:
 |      Exception
 |      BaseException
 |      object

上面写着“不退出”???如果不退出,不退出意味着什么


Tags: 模块用户self警告定义defexceptioncondition
1条回答
网友
1楼 · 发布于 2024-10-03 09:15:18

如果需要警告,请使用警告。不要提出例外。定义一个单独的警告级别:

class MyException(Exception):
    ...

class MyWarning(Warning):
    ...

当您希望发出警告而不是引发以下问题时,请使用warnings.warn而不是raise

warnings.warn("Oh no, bad things!", MyWarning)

您尝试使用Warning失败,因为您仍然试图raise警告,而不是通过警告系统

相关问题 更多 >