Как использовать ключевое слово Raise в Python

Я прочитал официальное определение «рейза», но до сих пор не совсем понимаю, что оно означает.

Проще говоря, что такое «рейз»?

Пример использования поможет.


person Capurnicus    schedule 19.12.2012    source источник
comment
В некоторых других языках он известен как throw.   -  person voithos    schedule 19.12.2012
comment
Думаю, уместное дополнение к этому вопросу: raise выходит из функции автоматически или нужно return после raise?   -  person alisa    schedule 31.05.2018


Ответы (6)


У него 2 цели.

yentup предоставил первый.

Он используется для создания ваших собственных ошибок.

if something:
    raise Exception('My error!')

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

try:
  generate_exception()
except SomeException as e:
  if not can_handle(e):
    raise
  handle_exception(e)
person Ignacio Vazquez-Abrams    schedule 19.12.2012
comment
Я набрал это и получил глобальное имя «ошибка» не определено. Для других, плохо знакомых с Python, вам нужно поднять исключение («Моя ошибка!»). Вы заменяете ошибку своим именем исключения. Список стандартных исключений, которые вы можете использовать, находится здесь: docs.python.org/2/library /exceptions.html - person Curtis Yallop; 28.02.2014
comment
Обратите внимание, что в python 3.x новый синтаксис except SomeException as e: - person P-Gn; 10.11.2016
comment
@ user1735003, что делает as e? Чем он отличается от except SomeException? - person alpha_989; 14.01.2018
comment
@ alpha_989: позволяет получить фактический экземпляр исключения. - person Ignacio Vazquez-Abrams; 14.01.2018

Он используется для вывода ошибок.

if something:
    raise Exception('My error!')

Некоторые примеры здесь

person jackcogdill    schedule 19.12.2012

raise без аргументов - это специальное использование синтаксиса Python. Это означает получить исключение и повторно возбудить его. При таком использовании его можно было бы назвать reraise.

    raise

Из Справочника по языку Python:

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

Если raise используется отдельно без аргументов, используется строго для ререйза. Если это сделано в ситуации, которая не является повторным вызовом другого исключения, отображается следующая ошибка: RuntimeError: No active exception to reraise

person Sohail Si    schedule 14.01.2015

Помимо raise Exception("message") и raise Python 3 представил новую форму raise Exception("message") from e. Это называется цепочкой исключений, она позволяет сохранить исходное исключение (основную причину) с его трассировкой.

Это очень похоже на внутренние исключения из C #.

Дополнительная информация: https://www.python.org/dev/peps/pep-3134/

person Stan Prokop    schedule 04.05.2017
comment
Когда я следую этому подходу, рекомендуется ли печатать трассировку на нижнем уровне, где возникает ошибка, или на самом высоком уровне, чтобы улавливать переносимую ошибку? - person alper; 28.04.2020

Вы можете использовать его, чтобы вызывать ошибки как часть проверки ошибок:

if (a < b):
    raise ValueError()

Или обработайте некоторые ошибки, а затем передайте их как часть обработки ошибок:

try:
    f = open('file.txt', 'r')
except IOError:
    # do some processing here
    # and then pass the error on
    raise
person sampson-chen    schedule 19.12.2012

raise вызывает исключение. В некоторых других языках вместо этого используется глагол «бросить».

Он предназначен для сигнализации об ошибке; он отмечает, что ситуация является исключительной для нормального потока.

Возникшие исключения могут быть снова перехвачены кодом «вверх по течению» (окружающий блок или функция, ранее находившаяся в стеке), чтобы обработать их, используя комбинацию try, except.

person Martijn Pieters    schedule 19.12.2012
comment
Во время ререйза и ловли исключения до верхнего уровня. должен ли я печатать trace в нижнем вызове, где возникает ошибка, или в самом верхнем вызове? или рекомендуется делать raise Exception("message") from e, чтобы довести ошибку до верхнего уровня? - person alper; 28.04.2020
comment
@alper: не уверен, о чем вы спрашиваете. Если вы перехватываете исключение в обработчике except ...:, трассировка будет включать весь стек, от точки, где ваша программа Python была запущена, до места, где возникло исключение. Так что на самом деле не имеет значения, где в стеке находится ваш обработчик. Если вам нужно повторно вызвать исключение после обработки, используйте raise, больше ничего. - person Martijn Pieters; 29.04.2020
comment
@alper: raise Exception("message") from e заменяет e исключение новым исключением, но простой Exception экземпляр не имеет смысла. Если e был TypeError, ValueError или LibrarySpecificException, вы больше не можете улавливать эти конкретные исключения, потому что вы заменили его на Exception. - person Martijn Pieters; 29.04.2020