【问题标题】:Is it appropriate to raise an EnvironmentError for os.environ?为 os.environ 引发 EnvironmentError 是否合适?
【发布时间】:2018-11-24 23:14:05
【问题描述】:

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 文档说EnvironmentErrorOSError 的基类,并且基异常“...仅用作其他异常的基类”。在 Python 3.6 文档中,EnvironmentError is listed among concrete exceptions,但没有任何关于错误类本身的文档。问题:

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

【问题讨论】:

  • 您的问题 2 和 3 实际上已在您的链接中得到解答,就在锚点上方:The following exceptions are kept for compatibility with previous versions; starting from Python 3.3, they are aliases of OSError.。如果您不想使用/查看 OSError,请创建自己的。但是,我会坚持使用 OSError,它在这种情况下似乎很合适。鉴于 EnvironmentError 只是为了在 Python >= 3.3 中保持兼容性,我认为它在 Python 3.6 中的使用不合适。

标签: python python-3.x error-handling environment-variables


【解决方案1】:

你为什么不直接使用

my_value = os.getenv("SOME_VALUE")

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

【讨论】:

  • OP 在这里询问哪种错误类型是合适的。
【解决方案2】:

我对“EnvironmentError”是什么感到有些困惑。它与环境变量无关。 exception EnvironmentError 的原意(在 Python 2 中)是:

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

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


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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-20
    • 2017-03-24
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    相关资源
    最近更新 更多