2009-05-05 1 views
6

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

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

ответ

7

I know that I can just check for root access before the import, but I'd like to know how to catch this spesific kind of error via a try/except statement for future reference. Is there any way to differentiate between this RuntimeError and others that might be raised?

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

Я согласен с приведенными выше текстами. Соответствие текста на ошибке - это страшная перспектива.

4
try: 
    import pyparted 
except RuntimeError: 
    print('RuntimeError is raised') 
    raise 

больше на exception handling in tutorial.

Эта ситуация должна произвести ImportError, на мой взгляд. И вы можете сделать это сами:

try: 
    import pyparted 
except RuntimeError as e: 
    raise ImportError(e) 
1

Да.

try: 
     import module 
    except RuntimeError: 
     pass 

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

if condition: 
    import module 
1
try: 
    import ... 
except RuntimeError: 
    # Do something 
8

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

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

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

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

... For 2.6, the message attribute is being deprecated in favor of the args attribute.

+1

, и вам нужно будет изменить это каждый раз, когда разработчики меняют букву в сообщении об ошибке. – SilentGhost

+3

Это плохо!вы не должны сравнивать это сообщение об ошибке, если это абсолютно неизбежно. –

+0

К сожалению, похоже, что в этом случае сравнение сообщения об ошибке * * неизбежно - pyparted, похоже, не вызывает более конкретной ошибки. –

0

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() 

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

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