Всякие недопустимые операции типа деления на 0 или открытия несуществующего файла приводят к возбуждению исключений. Интерпретатор питон печатает подробную и понятную информацию об исключении. Если это интерактивный интерпретатор, то сессия продолжается; исли это программа, то её выполнение прекращается. В питоне отладчик приходится использовать гораздо реже, чем в более низкоуровневых языках, потому что эти сообщения интерпретатора позволяют сразу понять, где и что неверно. Впрочем, иногда приходится использовать и отладчик. Допустим, из сообщения об ошибке Вы поняли, что некоторая функция вызвана со строковым аргументом, а Вы про него думали, что он число. Тогда приходится искать - какая сволочь испортила мою переменную?
1/0
Исключения можно отлавливать, и в случае, если они произошли, выполнять какой-нибудь корректирующий код.
try:
x=0
x=1/x
except ZeroDivisionError:
x=5
x
try:
s='xyzzy'
f=open(s)
except IOError:
print('cannot open '+s)
Исключения - это объекты. Класс Exception
являестя корнем дерева классов исключений. Этот объект можно поймать и исследовать.
try:
x=1/0
except Exception as err:
print(type(err))
print(err)
print(repr(err))
print(err.args)
Если в Вашем коде возникла недопустимая ситуация, нужно возбудить исключение оператором raise
.
raise NameError('Hi there')
Вот более полезный пример.
def f(x):
if x==0:
raise ValueError('x should not be 0')
return x
try:
x=f(1)
x=f(0)
except ValueError as err:
print(repr(err))
x
Естественно, можно определять свои классы исключений, наследуя от Exception
или от какого-нибудь его потомка, подходящего по смыслу. Именно так и нужно делать, чтобы Ваши исключения не путались с системными.
class MyError(Exception):
def __init__(self,value):
self.value=value
def __str__(self):
return str(self.value)
def f(x):
if x<0:
raise MyError(x)
else:
return x
try:
x=f(2)
x=f(-2)
except MyError as err:
print(err)
x