当
os.environ
被赋予未设置的环境变量名称时,它会抛出 KeyError
:
In [1]: my_value = os.environ['SOME_VALUE']
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-6-0573debe183e> in <module>()
----> 1 my_value = os.environ['SOME_VALUE']
~/blah/ve/lib/python3.6/os.py in __getitem__(self, key)
667 except KeyError:
668 # raise KeyError with the original key value
--> 669 raise KeyError(key) from None
670 return self.decodevalue(value)
671
KeyError: 'SOME_VALUE'
我发现
KeyError
被引发,因为 os.environ
就像一个字典,但在需要设置 SOME_VALUE
的应用程序中,我想在用户忽略设置它时引发更多信息错误。一种选择是提出 EnvironmentError
并提供更多信息:
try:
my_value = os.environ['SOME_VALUE']
except KeyError:
raise EnvironmentError('SOME_VALUE environment variable needs to be set to import this module') from KeyError
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
KeyError:
The above exception was the direct cause of the following exception:
OSError Traceback (most recent call last)
<ipython-input-10-406772b14ea9> in <module>()
2 my_value = os.environ['SOME_VALUE']
3 except KeyError:
----> 4 raise EnvironmentError('SOME_VALUE environment variable not set') from KeyError
OSError: SOME_VALUE environment variable not set
我很好奇这会引起
OSError
。 Python 2.7 文档称 EnvironmentError
是 OSError
的基类,并且基异常“...仅用作其他异常的基类”。在 Python 3.6 文档中,EnvironmentError
列在具体异常中,但没有任何有关错误类本身的文档。问题:
EnvironmentError
是否合适?我应该使用其他内置错误,还是自定义错误?EnvironmentError
是Python 3.6中的基本错误类吗?OSError
被提升而不是 EnvironmentError
?我对“EnvironmentError”是什么感到有点困惑。它与环境变量无关。 Exception
EnvironmentError
(在 Python 2 中)的原始含义是:
Python系统之外可能发生的异常的基类:
、IOError
。OSError
在 PEP 3151 中,IO 和 OS 异常针对 Python 3.3 进行了重新设计,因此它们都使用
OSError
作为基类。 EnvironmentError
保留为 OSError
的别名,以实现向后兼容性。
与环境变量相关的异常的一些适当建议可能是:
RuntimeError
- 这是一个有点“杂项”的异常类型,但如果本地运行环境没有设置变量,那么它可能是合适的。ValueError
- 环境变量已设置,但其值存在异常。你为什么不直接使用
my_value = os.getenv("SOME_VALUE")
如果不存在则返回None。如果您愿意,您可以抛出自己的错误。