Как определить, какой вызов функции вызывает исключение в Python? - PullRequest
4 голосов
/ 04 марта 2010

Мне нужно определить, кто вызывает исключение, чтобы лучше обработать ошибку str, есть ли способ?

посмотрите на мой пример:

try:
   os.mkdir('/valid_created_dir')
   os.listdir('/invalid_path')
except OSError, msg:

   # here i want i way to identify who raise the exception
   if is_mkdir_who_raise_an_exception:
      do some things

   if is_listdir_who_raise_an_exception:
      do other things ..

как я могу справиться с этим, в python?

Ответы [ 4 ]

9 голосов
/ 04 марта 2010

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

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

import os, sys, traceback

try:
   os.mkdir('/valid_created_dir')
   os.listdir('/invalid_path')
except OSError, msg:
   tb = sys.exc_info()[-1]
   stk = traceback.extract_tb(tb, 1)
   fname = stk[0][2]
   print 'The failing function was', fname

Конечно, вместо print вы будете использовать if проверки, чтобы точно решить, какую обработку делать.

8 голосов
/ 04 марта 2010

Оберните в «try / catch» каждую функцию отдельно.

try:
   os.mkdir('/valid_created_dir')
except Exception,e:
   ## doing something,
   ## quite probably skipping the next try statement

try:
   os.listdir('/invalid_path')
except OSError, msg:
   ## do something 

Это в любом случае поможет читаемости / пониманию.

1 голос
/ 04 марта 2010

Как насчет простого решения:

try:
   os.mkdir('/valid_created_dir')
except OSError, msg:
   # it_is_mkdir_whow_raise_ane_xception:
   do some things

try:
   os.listdir('/invalid_path')
except OSError, msg:    
   # it_is_listdir_who_raise_ane_xception:
   do other things ..
0 голосов
/ 06 марта 2010

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

import os, sys
def func():
    try:
       os.mkdir('/dir')
    except OSError, e:
        if e.errno != os.errno.EEXIST:
            e.action = "creating directory"
            raise

    try:
        os.listdir('/invalid_path')
    except OSError, e:
        e.action = "reading directory"
        raise

try:
    func()
except Exception, e:
    if getattr(e, "action", None):
        text = "Error %s: %s" % (e.action, e)
    else:
        text = str(e)
    sys.exit(text)

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...