python - 如何防止在 Python 中引发自定义异常?
问题描述
我一直在搞乱自定义异常,但我想知道它如何根据变量是否存在来防止自身被引发。
例如。
class MyError(Exception):
def __init__(self, var):
if var == "prevent":
# Stop exception from being raised
raise MyError("prevent")
解决方案
您可以通过引发异常来中断任何控制流(包括本身正在初始化和引发异常的控制流),这在技术上可以通过让 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
块下按顺序调用它们,该块将处理引发的第一个错误。
推荐阅读
- google-chrome - Google Chrome 中的 SVG 打印问题
- rust - Rust 宏规则中的 S 表达式
- mysql - 如何使用 paypal 标准集成结帐发送自定义变量?
- python - 我目前正在用 pygame 制作游戏,我需要一些矢量代码的解释
- python - python中[iter(list)] * 2的含义是什么?
- javascript - 从 Typescript 的接口中提取方法类型
- javascript - 将结果从 .foreach 保存到 .map
- unity3d - 移动鼠标光标与游戏手柄问题
- r - 按日期和城市将 NA 替换为另一个 df 的值
- html - 如何更改语义 UI 下拉菜单的边框样式?