Как я могу вызвать исключение в Python, чтобы потом его можно было перехватить через блок except?

2173
TIMEX 13 Янв 2010 в 00:07

6 ответов

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

try:
    foo() 
except Exception as e:
    print(str(e)) # Print out handled error

Заблокировать хороший способ сделать это. Вы все равно захотите raise определенных исключений, чтобы вы знали, что они означают.

2
Justin Fay 7 Авг 2019 в 11:05

Другой способ создать исключение - assert . Вы можете использовать assert для проверки выполнения условия, если нет, то оно вызовет AssertionError. Для получения более подробной информации смотрите здесь.

def avg(marks):
    assert len(marks) != 0,"List is empty."
    return sum(marks)/len(marks)

mark2 = [55,88,78,90,79]
print("Average of mark2:",avg(mark2))

mark1 = []
print("Average of mark1:",avg(mark1))
2
Rehan Haider 27 Фев 2019 в 09:42

Сначала прочтите существующие ответы, это всего лишь дополнение.

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

Примере:

raise SystemExit

Выход из программы, но вы можете знать, что произошло. Так что вы можете использовать это.

raise SystemExit("program exited")

Это выведет «программу вышла» в stderr перед закрытием программы.

12
Anant Prakash 2 Дек 2017 в 12:59

Для общего случая, когда вам нужно выдать исключение в ответ на некоторые неожиданные условия, и который вы никогда не намереваетесь отловить, а просто быстро потерпеть неудачу, чтобы дать вам возможность отладки оттуда, если это когда-нибудь произойдет, - наиболее логичным кажется {{Х0}} :

if 0 < distance <= RADIUS:
    #Do something.
elif RADIUS < distance:
    #Do something.
else:
    raise AssertionError("Unexpected value of 'distance'!", distance)
35
Evgeni Sergeev 19 Май 2015 в 04:55

В Python 3 есть 4 различных синтаксиса для вызова исключений:

1. raise exception 
2. raise exception (args) 
3. raise
4. raise exception (args) from original_exception

< Сильный > 1 . поднять исключение против 2. поднять исключение (аргументы)

Если вы используете raise exception (args) для создания исключения, тогда args будет напечатан при печати объекта исключения - как показано в примере ниже.

  #raise exception (args)
    try:
        raise ValueError("I have raised an Exception")
    except ValueError as exp:
        print ("Error", exp)     # Output -> Error I have raised an Exception 



  #raise execption 
    try:
        raise ValueError
    except ValueError as exp:
        print ("Error", exp)     # Output -> Error 

< Сильный > 3.raise

Оператор raise без каких-либо аргументов повторно вызывает последнее исключение. Это полезно, если вам необходимо выполнить некоторые действия после перехвата исключения, а затем повторно вызвать его. Но если раньше не было никаких исключений, raise оператор вызывает TypeError Исключение.

def somefunction():
    print("some cleaning")

a=10
b=0 
result=None

try:
    result=a/b
    print(result)

except Exception:            #Output ->
    somefunction()           #some cleaning
    raise                    #Traceback (most recent call last):
                             #File "python", line 8, in <module>
                             #ZeroDivisionError: division by zero

< Сильный > 4 . вызвать исключение (аргументы) из оригинального исключения

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

class MyCustomException(Exception):
pass

a=10
b=0 
reuslt=None
try:
    try:
        result=a/b

    except ZeroDivisionError as exp:
        print("ZeroDivisionError -- ",exp)
        raise MyCustomException("Zero Division ") from exp

except MyCustomException as exp:
        print("MyException",exp)
        print(exp.__cause__)

Вывод:

ZeroDivisionError --  division by zero
MyException Zero Division 
division by zero
50
N Randhawa 4 Дек 2019 в 08:33

НЕ ДЕЛАЙТЕ ЭТОГО . Поднять голый Exception абсолютно не . см. отличный ответ Аарона Холла.

Не могу получить гораздо более питонического, чем это:

raise Exception("I know python!")

См. документ поднять инструкцию для python, если хотите. больше информации.

532
Community 23 Май 2017 в 10:31