print - python try except пример




Захват нескольких исключений в одной строке(кроме блока) (5)

Как уловить несколько исключений в одной строке (кроме блока)

Сделай это:

try:
    may_raise_specific_errors():
except (SpecificErrorOne, SpecificErrorTwo) as error:
    handle(error) # might log or have some other default behavior...

Скобки необходимы из-за более старого синтаксиса, который использовал запятые для присвоения объекту ошибки имени. Ключевое слово as используется для назначения. Вы можете использовать любое имя для объекта ошибки, я предпочитаю error лично.

Лучшая практика

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

Вот пример простого использования:

try:
    mainstuff()
except (KeyboardInterrupt, EOFError): # the parens are necessary
    quit(0)

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

Это описано здесь: https://docs.python.org/tutorial/errors.html

Вы можете назначить исключение переменной, ( e является общей, но вы можете предпочесть более подробную переменную, если у вас длительная обработка исключений, или ваша среда IDE выделяет только выделение, большее, чем это делает мой.) У экземпляра есть атрибут args. Вот пример:

try:
    mainstuff()
except (KeyboardInterrupt, EOFError) as err: 
    print(err)
    print(err.args)
    quit(0)

Обратите внимание, что в Python 3 объект err выпадает из области действия, когда завершается блок except .

Устаревшие

Вы можете увидеть код, который присваивает ошибку запятую. Это использование, единственная форма, доступная в Python 2.5 и более ранних версиях, устарела, и если вы хотите, чтобы ваш код был совместим с переходом на Python 3, вы должны обновить синтаксис, чтобы использовать новую форму:

try:
    mainstuff()
except (KeyboardInterrupt, EOFError), err: # don't do this in Python 2.6+
    print err
    print err.args
    quit(0)

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

Менеджер контекста suppress

Принятый ответ - это действительно 4 строки кода, минимум:

try:
    do_something()
except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass

try , except pass строк, может обрабатываться в одной строке с помощью диспетчера контекста подавления, доступного в Python 3.4 :

from contextlib import suppress

with suppress(IDontLikeYouException, YouAreBeingMeanException):
     do_something()

Поэтому, когда вы хотите pass определенные исключения, используйте suppress .

Я знаю, что могу сделать:

try:
    # do something that may fail
except:
    # do this if ANYTHING goes wrong

Я также могу это сделать:

try:
    # do something that may fail
except IDontLikeYouException:
    # say please
except YouAreTooShortException:
    # stand on a ladder

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

try:
    # do something that may fail
except IDontLikeYouException:
    # say please
except YouAreBeingMeanException:
    # say please

Есть ли способ, которым я могу сделать что-то вроде этого (так как действие, которое нужно принять в обоих исключениях, это say please ):

try:
    # do something that may fail
except IDontLikeYouException, YouAreBeingMeanException:
    # say please

Теперь это действительно не сработает, поскольку он соответствует синтаксису:

try:
    # do something that may fail
except Exception, e:
    # say please

Итак, мое стремление поймать два разных исключения не совсем точно.

Есть ли способ сделать это?


Документация Python 2.7 гласит, что:

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

try:
    raise ValueError("hello")
except (RuntimeError, ValueError, KeyError) as a:
    print a

Обратите внимание, что скобки вокруг этого кортежа необходимы, потому что, за исключением ValueError, e: был синтаксисом, используемым для того, что обычно записывается как за исключением ValueError как e: в современном Python (описано ниже). Старый синтаксис по-прежнему поддерживается для обратной совместимости. Это означает, что кроме RuntimeError, TypeError не эквивалентен исключению (RuntimeError, TypeError): но кроме RuntimeError как TypeError: это не то, что вы хотите.


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

#This example code is a technique I use in a library that connects with websites to gather data

ConnectErrs  = (URLError, SSLError, SocketTimeoutError, BadStatusLine, ConnectionResetError)

def connect(url, data):
    #do connection and return some data
    return(received_data)

def some_function(var_a, var_b, ...):
    try: o = connect(url, data)
    except ConnectErrs as e:
        #do the recovery stuff
    blah #do normal stuff you would do if no exception occurred

ЗАМЕТКИ:

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

  2. Если вы просто не можете терпеть глобальную переменную, определите ее в main () и передайте ее туда, где это необходимо ...


Из документации Python -> 8.3 Обработка исключений :

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

except (RuntimeError, TypeError, NameError):
    pass

Обратите внимание, что скобки вокруг этого кортежа необходимы, потому что, за исключением ValueError, e: был синтаксисом, используемым для того, что обычно записывается как except ValueError as e: в современном Python (описано ниже). Старый синтаксис по-прежнему поддерживается для обратной совместимости. Это означает, что except RuntimeError, TypeError не эквивалентен except (RuntimeError, TypeError): но except RuntimeError as TypeError: это не то, что вы хотите.


Один из способов сделать это.

try:
   You do your operations here;
   ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
   If there is any exception from the given exception list, 
   then execute this block.
   ......................
else:
   If there is no exception then execute this block. 

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

try:
   You do your operations here;
   ......................
except Exception1:
    functionname(parameterList)
except Exception2:
    functionname(parameterList)
except Exception3:
    functionname(parameterList)
else:
   If there is no exception then execute this block. 

def functionname( parameters ):
   //your task..
   return [expression]

Я знаю, что второй - это не лучший способ сделать это, но я просто показываю несколько способов сделать это.







exception-handling