首页 > 解决方案 > 如何防止在 Python 中引发自定义异常?

问题描述

我一直在搞乱自定义异常,但我想知道它如何根据变量是否存在来防止自身被引发。

例如。

class MyError(Exception):
    def __init__(self, var):
        if var == "prevent":
            # Stop exception from being raised


raise MyError("prevent")

标签: pythonexceptionpython-class

解决方案


您可以通过引发异常来中断任何控制流(包括本身正在初始化和引发异常的控制流),这在技术上可以通过让 init 引发特定异常来防止在其自己的 init 中引发不同的例外:

>>> class MyError(Exception):
...     def __init__(self, var):
...         if var == "prevent":
...             raise ValueError("unacceptable to raise MyError right now")
...
>>> try:
...     raise MyError("prevent")
... except MyError:
...     print("UNACCEPTABLE!")
... except ValueError:
...     print("okie dokie")
...
okie dokie

正如其他人所建议的那样,更典型的模式是在引发异常之前进行检查(这样您就可以完全避免引发任何异常)。将它放在包装异常的函数中是完全合理的,例如:

>>> class MyError(Exception):
...     pass
...
>>> def maybe_raise_myerror(var):
...     if var != "prevent":
...         raise MyError
...
>>> maybe_raise_myerror("prevent")
>>> maybe_raise_myerror("foo")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in maybe_raise_myerror
__main__.MyError

这种模式的一个用途是一组验证器——你的函数有条件地引发不同的异常,这些异常对应于不同的验证错误,你可以在一个try块下按顺序调用它们,该块将处理引发的第一个错误。


推荐阅读