Если я хочу создать общее исключение, что мне делать в Python? - PullRequest
3 голосов
/ 26 января 2012

Итак, скажем, у меня есть этот код Python:

def loopForEachFileInDirectory(self, conn):
    for filename in os.listdir(uploadedFilesDirectory):
        try:
            self.insertNewEntryForStagingFile(conn, filename)
            self.copyFilesToStagingDirectory(filename)
        except: ???

def copyFilesToStagingDirectory(self, filename):
    logging.info("copying %s to youtube_ready",filename)
    try:
        shutil.copy(uploadedFilesDirectory+filename, stagingDirectory)
        logging.info("move successful")
    except shutil.Error,e:
        logging.warn("move failed for reasons \n\t%d:%s", e.args[0],e.args[1])
        raise ???

Теперь у метода loopForEachFileInDirectory будет еще несколько методов - я делаю немного чистого кода (приветствует Роберта Мартина) здесь. Что я хотел бы, так это всплыть любые исключения из под-методов, и, если что-то случится в главном цикле, внести залог в этот цикл и продолжить.

Вопрос в том, каково правило для всплытия общего исключения? Я просто поднять самостоятельно? И если да, то как я генерирую исключение общего характера, и как мне перехватить и записать подробности общего исключения?

Ответы [ 3 ]

6 голосов
/ 26 января 2012

каково правило для всплытия общего исключения? Мне просто поднять самостоятельно?

Да. Короткий ответ - просто использовать raise.

И если да, то как мне генерировать исключение ...

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

Exception - исключение базового класса. except Exception работает во всех типах Exception потому что все исключения Python наследуются от этого класса.

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

Я не считаю, что указывать это строго необходимо в этом контексте. На самом деле, вполне вероятно, что всплывет исключение со значением по умолчанию:

except:
  raise

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

.. и как мне отловить и записать детали общего исключения?

logging.exception - хороший путь. Попробуйте это так:

try:
   <something that raises an error>
except Exception, e:
   logging.exception(e)
3 голосов
/ 26 января 2012

Краткое расширение Python 3 к написанному другими авторами.В большинстве случаев достаточно raise.Это вызывает новое исходное исключение, которое вы хотите сделать в большинстве случаев.

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

В таких случаях конструкция raise ... from ... (боюсь, только Python 3) полезна какin:

try:
    self.file = open(filename)
except IOError, exc:
    raise DatabaseError('failed to open') from exc

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

Правильная переупаковка исключений в Python 2 сложнее, есть хорошая публикация в блоге Иана Бикинга, освещающая эту тему здесь: http://blog.ianbicking.org/2007/09/12/re-raising-exceptions/

0 голосов
/ 26 января 2012
#!/usr/bin/python

try:
        print 'Youll see me first.'

        try:
                1[90]

        except Exception,e:

                print "************ UTOH!",str(e)
                raise e

except Exception,e:

        print ">>>>>>>>>>>> I concur, THE JIG IS UP!",str(e)
        raise e
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...