为 os.environ 引发环境错误是否合适?

问题描述 投票:0回答:2

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
列在具体异常
中,但没有任何有关错误类本身的文档。问题:

  1. 在这种情况下使用
    EnvironmentError
    是否合适?我应该使用其他内置错误,还是自定义错误?
  2. EnvironmentError
    是Python 3.6中的基本错误类吗?
  3. 为什么
    OSError
    被提升而不是
    EnvironmentError
python python-3.x error-handling environment-variables
2个回答
7
投票

我对“EnvironmentError”是什么感到有点困惑。它与环境变量无关。 Exception

EnvironmentError
(在 Python 2 中)的原始含义是:

Python系统之外可能发生的异常的基类:

IOError
OSError

PEP 3151 中,IO 和 OS 异常针对 Python 3.3 进行了重新设计,因此它们都使用

OSError
作为基类。
EnvironmentError
保留为
OSError
的别名,以实现向后兼容性。


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

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

0
投票

你为什么不直接使用

my_value = os.getenv("SOME_VALUE")

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

© www.soinside.com 2019 - 2024. All rights reserved.