Какое исключение следует вызывать, если отсутствует требуемая переменная среды? - PullRequest
1 голос
/ 27 февраля 2020

Название уже в значительной степени подытоживает.

У меня есть фрагмент кода, который вызывает os.getenv, чтобы получить как URL, так и токен для подключения к услуге. Код находится в модуле и будет импортирован только оттуда, т.е. это не скрипт.

Это совсем не большая проблема, поскольку мне действительно нужно всего лишь взломать sh и отобразить сообщение о том, что есть неустановленные значения, но это заставило меня задуматься о том, какой из встроенных Python в исключениях будет лучше всего.

Я нашел EnvironmentError, но, похоже, он функционирует как базовый класс, от которого наследуются IOError и другие связанные с ОС исключения.

Будет ли это просто как ValueError, так как на самом деле просто отсутствует значение?

Спасибо!

Ответы [ 4 ]

1 голос
/ 27 февраля 2020

Вы всегда можете создать пользовательское исключение

https://www.programiz.com/python-programming/user-defined-exception https://docs.python.org/3/tutorial/errors.html

Я использовал это руководство раньше:

Что-то простое, например

class UnconfiguredEnvironment(Exception):
    """base class for new exception"""
    pass

if not os.environ.get("URL",None):
    raise UnconfiguredEnvironment

Используйте направляющие для расширения по своему усмотрению.

1 голос
/ 27 февраля 2020

Вы можете сделать свои собственные исключения для определенных c случаев, унаследовав от Exception

class MissingEnvironmentVariable(Exception):
    pass


def get_my_env_var(var_name):
    try:
        envvar = os.environ[var_name]
    except KeyError:
        raise MissingEnvironmentVariable(f"{var_name} does not exist")
1 голос
/ 27 февраля 2020

Ну, большинство встроенных в конкретные классы исключений предназначены для конкретных c вариантов использования, и этот не подходит ни для кого, кроме RuntimeError. Но я бы посоветовал вам использовать пользовательский подкласс Exception.

1 голос
/ 27 февраля 2020

По умолчанию KeyError уже вызывается, когда переменная окружения не существует. os.environ["THISENVDOESNTEXIST"]

Кроме того, вы можете указать переменную по умолчанию, если переменная env не существует. Это не вызовет ошибки. os.environ.get("THISENVDOESNTEXIST", "defaultvalue")

Выполненный код:

Python 3.7.4 (tags/v3.7.4:e09359112e, Jul  8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.environ["THISENVDOESNTEXIST"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\Tin\AppData\Local\Programs\Python\Python37\lib\os.py", line 678, in __getitem__
    raise KeyError(key) from None
KeyError: 'THISENVDOESNTEXIST'
>>> os.environ.get("THISENVDOESNTEXIST", "defaultvalue")
'defaultvalue'

Если вы хотите вызвать собственную ошибку, вы можете сделать это:

class MyException(Exception):
  pass

try:
  os.environ["THISENVDOESNTEXIST"]
except KeyError as e:
  raise MyException("Tried accessing an environment variable that does not exist")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...