Улавливать только некоторые ошибки времени выполнения в Python
-
05-07-2019 - |
Вопрос
Я импортирую модуль, который в некоторых условиях выдает следующую ошибку:Ошибка времени выполнения:для 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()
Но всегда крайне не рекомендуется менять предел рекурсии, но допускаются очень небольшие изменения в пределе рекурсии