Улавливать только некоторые ошибки времени выполнения в Python

StackOverflow https://stackoverflow.com/questions/825909

Вопрос

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

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

Это было полезно?

Решение

  

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

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

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

Другие советы

Вы можете проверить атрибуты исключения, чтобы отличать его от других возможных исключений 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 .

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

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

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

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

ДА.

   try:
        import module
   except RuntimeError:
         pass

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top