Разница между Raise Try и Assert

Итак, я изучал Python некоторое время и raise функции assert (Я понял ,что оба они разбивают приложение, в отличие от try-except) действительно похожи, и я не вижу ситуации, когда вы бы использовали raise или assert над try.

6 ответов


утверждать:

используется, когда вы хотите "остановить" скрипт на основе определенного условия и вернуть что-то, чтобы помочь отладить быстрее:

list_ = ["a","b","x"]
assert "x" in list_, "x is not in the list"
print("passed") 
#>> prints passed

list_ = ["a","b","c"]
assert "x" in list_, "x is not in the list"
print("passed")
#>> 
Traceback (most recent call last):
  File "python", line 2, in <module>
AssertionError: x is not in the list

поднять:

две причины, которые полезны для этого:

1 / для использования с блоками try и except. Поднимите ошибку по вашему выбору, может быть пользовательским, как показано ниже, и не останавливает скрипт, если вы pass или contiune скрипт; или могут быть предопределенные ошибки raise ValueError()

class Custom_error(BaseException):
    pass

try:
    print("hello")
    raise Custom_error
    print("world")
except Custom_error:
    print("found it not stopping now")

print("im outside")

>> hello
>> found it not stopping now
>> im outside

заметил, что он не остановился? Мы можем остановить его, используя только exit (1) в блоке except.

2 / Raise также может использоваться для повторного вызова текущей ошибки, чтобы передать ее в стек, чтобы увидеть, может ли что-то еще справиться с ней.

except SomeError, e:
     if not can_handle(e):
          raise
     someone_take_care_of_it(e)

попробуйте / кроме блоков:

делает именно то, что вы думаете, пытается что-то, если появляется ошибка, вы поймаете его и справиться с ним, как вам нравится. Нет примера, так как есть один выше.


raise - вызывает исключение.

assert - поднять исключение если данное условие является (или не является) истинным.

try выполнить некоторый код, который может поднимите исключение, и если да, поймайте его.


assert cond, "text"

расширяется до чего-то вроде

if cond == False:
  raise AssertionError("text")

используйте assert, потому что он более читаем.


try/except блоки позволяют ловить и управлять исключениями. Исключения могут быть вызваны raise, assert, и большое количество ошибок, таких как попытка проиндексировать пустой список. raise обычно используется при обнаружении состояния ошибки. assert аналогично, но исключение возникает только при выполнении условия.

raise и assert иная философия. В коде есть много "нормальных" ошибок, которые вы обнаруживаете и вызываете ошибки. Возможно, веб-сайт не существует или значение параметра находится вне диапазона.

утверждения, как правило, зарезервированы для" Я клянусь, что это не может произойти " проблемы, которые, кажется, происходят в любом случае. Его больше похоже на отладку во время выполнения, чем обычное обнаружение ошибок во время выполнения. Утверждения могут быть отключены, если вы используете -O флаг или запустить из .pyo файлы вместо .pyc файлы, поэтому они не должны быть частью регулярного обнаружения ошибок.

если код качества продукции вызывает исключение, то выясните, что вы поступил неправильно. Если он поднимает AssertionError, у вас есть большая проблема.


исключения-это то, что Python (и некоторые другие языки) используют для устранения ошибок, возникающих при выполнении кода. raise ExceptionName говорит, что в коде есть ошибка, и указывает, что это за проблема, вызывая исключение, связанное с этой проблемой. assert expression оценить expression и вызывает исключение, если оно false.

try используется для выполнения кода, который может вызвать ожидаемое исключение. Вместо того, чтобы остановить программу, вы можете "поймать" исключение и разберитесь с ним в своем коде.

пример: допустим, что у вас есть словарь и список. Вы хотите посмотреть вещи из списка в словаре, пока не достигнете того, которого нет в словаре:

try:
    for item in my_list:
        print(my_dictionary[item])
except KeyError as e: #KeyError is the Exception raised when a key is not in a dictionary
    print('There is no {} in the dictionary'.format(e.args[0]))

Assert обычно используется для тестирования кода, чтобы убедиться, что что-то сработало:

def test_bool():
    assert True != False

где как попробовать, поднять и за исключением обработки исключений макияжа, которая является предпочтительным способом в python для обработки и распространения ошибок.

большинство библиотек и встроенных python будут вызывать и исключение того или иного типа, если что-то пойдет не так. Часто в вашем собственном коде вы также захотите создать исключение, когда обнаружите, что что-то идет не так. Скажем в качестве примера вы писали валидатор адресов электронной почты и хотели создать исключение, если адрес не содержит знака@. у вас может быть что-то вроде (это игрушечный код, на самом деле не проверяйте такие письма):

def validate_email(address):
    if not "@" in address:
        raise ValueError("Email Addresses must contain @ sign")

затем где-то еще в вашем коде вы можете вызвать функцию validate_email, и если она не сработает, будет создано исключение.

try:
    validate_email("Mynameisjoe.com")
except ValueError as ex:
    print("We can do some special invalid input handling here, Like ask the user to retry the input")
finally:
    close_my_connection()
    print("Finally always runs whether we succeed or not. Good for clean up like shutting things down.")

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

одна вещь, которую вы не хотите делать, это что-то вроде:

if __name__ == '__main__':
    try:
        print(1/0)
    except Exception as ex:
        pass

теперь у вас нет способа узнать, почему ваша заявка взорвали.

одна вещь, которую вы увидите часто, которая в порядке, - это что-то вроде:

import logging
if __name__ == '__main__':
    try:
        print(1/0)
    except Exception as ex:
        logging.exception(ex)
        raise

повышение в этом случае, поскольку оно не имеет параметров, повторно вызывает ту же ошибку. Часто в веб-коде вы увидите что-то похожее, что не вызывает исключение, потому что оно отправит ошибку 500 клиенту, а затем продолжит выполнение следующего запроса, поэтому в этом случае вы не хотите, чтобы программа заканчивалась.