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列在具体异常中,但没有关于错误类本身的任何文档。问题:
EnvironmentError在这种情况下?我应该使用其他一些内置错误,还是自定义错误?EnvironmentErrorPython 3.6 中的基本错误类吗?OSError被提出而不是EnvironmentError?我对“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。如果您愿意,您可以抛出自己的错误。
| 归档时间: |
|
| 查看次数: |
4275 次 |
| 最近记录: |