2013-09-06 3 views
1

То, что я пытаюсь сделать, это расширить базовый ImportError Exception, так что всякий раз, когда она называется, она делает нечто другое, аPython: Расширение Exception класс

import logging 

logging.basicConfig(filename="logs", level=logging.DEBUG) 

class ImportError(Exception): 

    def __init__(self, message): 
     Exception.__init__(self) 
     self.message = message 

     logging.warning(self.message) 



import module 

Но это не работает, может кто один скажите, пожалуйста, как мы можем достичь чего-то подобного.

спасибо.

ответ

2

ImportError - это встроенное исключение; ошибка импорта не будет искать исключения в текущем глобальном модуле.

Фактически, в Python 2 импортное оборудование даже не выглядит встроенным для этого; он использует эквивалент C исключения, PyExc_ImportError. Вы не можете заменить исключение своим.

Просто поймать исключение на верхнем уровне вашего питона основного сценария:

try: 
    main() # or whatever function is your main entrypoint 
except ImportError: 
    logging.exception('Import oopsie') 

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

В Python 3.1 и выше, импортная техника была в значительной степени переписана с использованием гораздо больше коды на Python, и вы можете сделать это с помощью builtins module и присваивания builtins.ImportError, но я бы сильно совета против такой хакер. Если вы do пошли по этому маршруту, отметьте, что ImportError отправлено name и path дополнительных аргументов в дополнение к message.

+0

ohk, поэтому это означает, что я не могу делать то, что я пытаюсь сделать, вместо этого я могу создать свой пользовательский класс «Исключение» и поднять его, когда я получу «ImportError» ?? – abhishekgarg

+0

@abhishekgarg: Точно. –

+0

Спасибо Martijn, также у меня есть много «try except» в моем скрипте, могу ли я также сделать «try except» для всей основной функции, как показано в вашем примере, а не нескольких разных? – abhishekgarg

Смежные вопросы