Поймать только некоторые ошибки во время выполнения в Python - PullRequest
6 голосов
/ 05 мая 2009

Я импортирую модуль, который в некоторых случаях вызывает следующую ошибку: RuntimeError: pyparted требуется root-доступ

Я знаю, что я могу просто проверить наличие корневого доступа перед импортом, но я хотел бы знать, как отловить этот особый вид ошибки с помощью оператора try / исключением для дальнейшего использования. Есть ли способ провести различие между этой RuntimeError и другими, которые могут быть вызваны?

Ответы [ 6 ]

9 голосов
/ 05 мая 2009

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

    try:
        import pypatred
    except RuntimeError,e:
        if e.message == 'RuntimeError: pyparted requires root access':
            return 'pyparted - no root access'
        raise

Конечно, прямое сравнение текста - это просто пример, вы можете искать включенные подстроки или регулярные выражения.

Стоит отметить, что атрибут исключений .message устарел, начиная с Python 2.6 . Вы можете найти текст в .args, обычно args[0].

... Для версии 2.6 атрибут message устарел в пользу атрибута args.

7 голосов
/ 05 мая 2009

Я знаю, что я могу просто проверить наличие корневого доступа перед импортом, но я хотел бы знать, как отловить этот особый вид ошибки с помощью оператора try / исключением для дальнейшего использования. Есть ли способ провести различие между этой RuntimeError и другими, которые могут быть вызваны?

Если ошибка вызвана определенным условием, то я думаю, что самый простой способ отловить ошибку - это проверить это условие, и вы сами можете вызвать более конкретную ошибку. В конце концов, «ошибка» существует до того, как ошибка возникнет, так как в этом случае это проблема со средой.

Я согласен с вышеизложенным - сопоставление текста по ошибке является ужасной перспективой.

4 голосов
/ 05 мая 2009
try:
    import pyparted
except RuntimeError:
    print('RuntimeError is raised')
    raise

подробнее о обработке исключений в учебнике .

По моему мнению, эта ситуация должна дать ImportError. И вы можете сделать это самостоятельно:

try:
    import pyparted
except RuntimeError as e:
    raise ImportError(e)
1 голос
/ 05 мая 2009
try:
   import ...
except RuntimeError:
   # Do something
1 голос
/ 05 мая 2009

Да.

   try:
        import module
   except RuntimeError:
         pass

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

if condition:
     import module
0 голосов
/ 15 мая 2013

RuntimeError Возникает при обнаружении ошибки, которая не попадает ни в одну из других категорий

def foo():
   try:
      foo()
   except RuntimeError, e:
      print e
      print " Runtime Error occurred due to exceeded maximum recursion depth "

Вот как мы поймаем RuntimeError, вызванную превышением предела рекурсии в python

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

import sys
def foo():
     try:
        foo()
     except RuntimeError, e:
        sys.setrecursionlimit(1200)
        foo()

Но всегда крайне не рекомендуется менять предел рекурсии, но допускаются очень небольшие изменения в пределе рекурсии

...