为 os.environ 引发 EnvironmentError 是否合适?

saf*_*fay 7 python error-handling environment-variables python-3.x

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'
Run Code Online (Sandbox Code Playgroud)

我知道 aKeyError被引发,因为os.environ它就像一个 dict,但是在需要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
Run Code Online (Sandbox Code Playgroud)

我很好奇这会引发OSError. Python 2.7 文档说EnvironmentError是 的基类OSError,并且基异常“......仅用作其他异常的基类。” 在 Python 3.6 文档中,EnvironmentError列在具体异常中,但没有关于错误类本身的任何文档。问题:

  1. 甚至适合使用 EnvironmentError在这种情况下?我应该使用其他一些内置错误,还是自定义错误?
  2. EnvironmentErrorPython 3.6 中的基本错误类吗?
  3. 为什么会OSError被提出而不是EnvironmentError

Mik*_*e T 7

我对“EnvironmentError”是什么感到有点困惑。它与环境变量无关。异常EnvironmentError的原始含义(在 Python 2 中)是:

Python 系统外部可能发生的异常的基类:IOError, OSError

PEP 3151中,IO 和操作系统异常针对 Python 3.3 进行了重新设计,以便它们全部用作OSError基类。EnvironmentVariable保留为 的别名OSError以实现向后兼容性。


对于与环境变量相关的异常,一些适当的建议可能是:

  • RuntimeError- 这有点像“杂项”异常类型,但如果本地运行环境没有设置变量,那么它可能是合适的。
  • ValueError- 环境变量已设置,但其值存在异常。


小智 1

你为什么不直接使用

my_value = os.getenv("SOME_VALUE")
Run Code Online (Sandbox Code Playgroud)

如果不存在,它只会返回 None。如果您愿意,您可以抛出自己的错误。

  • OP 询问哪种错误类型适合此处。 (7认同)