当给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中,但没有有关错误类本身的任何文档。问题:
  • 在这种情况下使用EnvironmentError甚至合适吗?我应该使用其他内置错误还是自定义错误?
  • EnvironmentError是Python 3.6中的基本错误类吗?
  • 为什么要提高OSError而不是EnvironmentError
  • 最佳答案

    你为什么不只用

    my_value = os.getenv("SOME_VALUE")
    

    如果不存在,它将仅返回None。而且,如果您愿意,可以抛出自己的错误。

    09-18 11:23