попробуй: кроме: не работает - PullRequest
10 голосов
/ 10 февраля 2011

Итак, я столкнулся с проблемой, когда механизм try: exception:, похоже, работает неправильно в python.

Вот содержимое моих двух файлов.

pytest1.py

import pytest2

class MyError( Exception ):
    def __init__( self, value ):
        self.value = value

    def __str__( self ):
        return repr( self.value )

def func1():
    raise MyError( 'This is an error' )

def func3():
    pytest2.func2()

if __name__ == '__main__':
    try:
        func3()
    except MyError, e:
        print 'I should catch here.'
    except:
        print 'Why caught here?'

pytest2.py

from pytest1 import func1

def func2():
    func1()

Выполнение первого файла дает следующий вывод:

$ python pytest1.py
Why caught here?

В основном,исключение не ловится.Если я распечатываю тип исключения, он печатается как <pytest1.MyError> вместо просто <MyError>.Я предполагаю, что это какая-то странная циклическая справочная вещь, но кажется, что она должна работать.

Ответы [ 3 ]

9 голосов
/ 10 февраля 2011

Основная программа на Python всегда импортируется как модуль __main__.

При импорте pytest2 существующий модуль не используется повторно, поскольку первоначально импортированный модуль имеет имя __main__, а не pytest2. В результате pytest1 запускается несколько раз, генерируя несколько классов исключений. __main__.MyError и pytest1.MyError В итоге вы бросаете одну и пытаетесь поймать другую.

Итак, не пытайтесь импортировать ваш основной модуль из других модулей.

2 голосов
/ 10 февраля 2011

Эта проблема вызвана импортом скрипта, который вы запускаете как модуль. Это производит две отдельные копии модуля!

Другой пример:

module.py

import module

class Foo: pass

def test():
    print Foo
    print module.Foo
    print Foo is module.Foo

if __name__ == '__main__': test()

main_script.py

import module
if __name__ == '__main__': module.test()

Результат

>python main_script.py
module.Foo
module.Foo
True

>python module.py
__main__.Foo
module.Foo
False

Запуск python somefile.py создает модуль с именем __main__, , а не somefile и запускает код в somefile.py в этом модуле. Вот почему if __name__ == '__main__': используется для проверки, запускается ли этот файл как сценарий или импортируется из какого-либо другого файла.

1 голос
/ 10 февраля 2011

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

Попробуйте заменить

except:
    print 'Why caught here?'

с

except Exception, e:
    print e

Это может рассказать вам больше о том, что пошло не так.

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