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

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

Однако поддаются ли мы, люди, полностью прекращая всякое движение каждому отдельному случаю дискомфорта, с которым мы сталкиваемся? Что ж, вашему коду Python это не обязательно. Введите оператор try.

Оператор try очень полезен в ситуациях, когда вам нужно точно настроить, что происходит при обнаружении ошибки. Отказ от ответственности: это не замена тщательно разработанного кода. Он просто представляет собой средство вызова определенной ошибки без последствий; возможность тщательно планировать непредвиденные обстоятельства / предупреждения, не прерывая выполнение.

Так как же на самом деле начать писать эти операторы попытки? Это просто!

Основное изложение

Оператор try имеет синтаксис, аналогичный синтаксису оператора if. Он начинается с блока кода, содержащего то, что нужно попробовать, за которым следует блок except, который содержит то, что запускать. вместо этого, если это привело к ошибке.

def a_simple_try_statement():
    try:
        #insert code that you would like to test.
    except:
        #code here will run if the test results in an error.

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

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

Ниже приведен пример, показывающий базовый синтаксис оператора try / except, который немного усложняется.

def a_way_to_divide_things(thing1,thing2):
    try:
        output = thing1 / thing2
    #If the function receives incompatible variable types:
    except TypeError:
        print("You must include only ints or floats")
    #If the function tries to divide by zero:
    except ZeroDivisionError:
        print("The universe refuses to reveal its secrets")
#Now the code is prepared to handle multiple (but not infinite) possibilities.

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



Возможности переменных и ситуации, когда вам может понадобиться что-то ДРУГОЕ

Когда вы начнете создавать свои собственные операторы try, вы можете непреднамеренно сломать свой код, поскольку столкнетесь с неожиданной ошибкой с неопределенной переменной после явного определения ее в попробуйте заявление. Хотя это немного противоречит интуиции, этого легко избежать, если осознать, что успешно выполненный код в операторе try не создает глобальных переменных!

Область видимости переменных может сбивать с толку и заслуживает дальнейшего изучения. Скажем так: то, что успешно работает в одном контексте, необязательно в другом:

def dysfunctional(stuff, more_stuff):
    try:
        output = stuff / more_stuff
    except:
        print("Yea... this isn't going to work...")
        output = False
    print(output)
#If this wasn't contained in a function, this code will fall apart.

Так что же происходит, когда вам нужно расширить область действия этой переменной? Прежде чем вы начнете придумывать способы скрыть некоторые утверждения if, подумайте о его более беспечном двойнике: else. Он подходит как последнее условие оператора try / except… без «если и» или «но»:

def functional(stuff, more_stuff):
    try:
        output = stuff / more_stuff
    except:
        print("Yea... this isn't going to work...")
        output = False
    #Runs if the code executed in the try statement successfully.
    else:
        output = stuff / more_stuff
    #Closes the try statement running regardless of its outcome.
    finally:
        print(output)
#If this code is run outside the function it still works!

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

↑ НАКОНЕЦ ↓

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

#Iterates through unique numbers in a list counting their
#occurrences keeping track of the most frequent.
def mode(dataset):    
    ordered = sorted(list(set(dataset)))
    for data in ordered:
        current_count = dataset.count(data)
        #Try-ing too hard to compensate for an empty variable
        #that breaks things during the first run of the for loop.
        try:
            count
        except:
            count = current_count
            the_mode = []
        if count < current_count:
            count = current_count
            the_mode = [data]
        elif count == current_count:
            the_mode.append(data)
        else: continue
        #Statement to address the possibility of no numbers
        #actually repeating.
        if ordered == the_mode:
            print(“There is no mode”)
            the_mode = None
    return the_mode

Хотя функция выполняет то, что она должна делать, проблема в том, что у вас действительно нет, чтобы попробовать ничего. Переменную «count» можно было бы так же легко инициализировать еще до начала цикла, и код был бы более ясным и кратким.

#Iterates through unique numbers in a list counting their
#occurrences keeping track of the most frequent.
def mode(dataset):
    ordered = sorted(list(set(dataset)
    #Initializing the variable here reduces those 4 lines of code
    #into a single one.
    count=0
    for data in ordered:
        current_count = dataset.count(data)
        if count < current_count:
            count = current_count
            the_mode = [data]
        elif count == current_count:
            the_mode.append(data)
        else: continue
        #Statement to address the possibility of no numbers
        #actually repeating.
        if ordered == the_mode:
            print(“There is no mode”)
            the_mode = None
    return the_mode

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

Мораль истории: используйте попробуйте, чтобы контролировать неконтролируемое; except всегда помните: не усложняйте вещи сложнее, чем вы должны!