Подтвердить что ты не робот

Python try/except: Показывать причину ошибки после отображения моих переменных

Я даже не знаю, какие слова нужно искать. Я хочу отображать части объекта ошибки в блоке except (аналогично объекту err в VBScript, который имеет Err.Number и Err.Description). Например, я хочу показать значения моих переменных, а затем показать точную ошибку. Понятно, что я вызываю ошибку "по очереди" ниже, но как я могу напечатать этот факт?

try: 
    x = 0 
    y = 1 
    z = y / x 
    z = z + 1 
    print "z=%d" % (z) 
except: 
    print "Values at Exception: x=%d y=%d " % (x,y) 
    print "The error was on line ..." 
    print "The reason for the error was ..." 
4b9b3361

Ответ 1

try:  
    1 / 0 
except Exception as e: 
    print e

Ответ 2

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

import traceback
try:
  x = 5
  y = 0
  print x/y
except ZeroDivisionError:
  print "Error Dividing %d/%d" % (x,y)
  traceback.print_exc()
except:
  print "A non-ZeroDivisionError occurred"

Вы можете вручную получить номер строки и другую информацию, вызвав traceback.print_exc()

Ответ 3

Строковое значение объекта исключения даст вам причину. Модуль traceback позволит вам получить доступ к полной трассировке.

Ответ 4

Лучше использовать стандартный модуль регистрации Python.

import sys, traceback, logging

logging.basicConfig(level=logging.ERROR)

try: 
    x = 0 
    y = 1 
    z = y / x 
    z = z + 1 
    print "z=%d" % (z) 
except: 
    logging.exception("Values at Exception: x=%d y=%d " % (x,y))

Это приводит к следующему выводу:

ERROR:root:Values at Exception: x=0 y=1 
Traceback (most recent call last):
  File "py_exceptions.py", line 8, in <module>
    z = y / x
ZeroDivisionError: integer division or modulo by zero

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

Ответ 5

Другими словами,

try:
    1/0
except Exception as e:
    print e

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

Ответ 6

Если вы делаете

except AssertionError as error:
    print(error)

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