Pythoni c способ не печатать сообщение об ошибке вверх - PullRequest
3 голосов
/ 20 февраля 2020

Я пытаюсь подавить ошибку / предупреждение в моем журнале при вызове библиотеки. Предположим, у меня есть этот код

        try:
            kazoo_client.start()
        except:
            pass

Это вызов клиента zookeeper, который выдает какое-то исключение, которое всплывает, теперь я не хочу, чтобы в моих журналах появлялось предупреждение / ошибка, когда я вызываю kazoo_client.start(), есть ли способ подавить это, когда вы звоните клиенту

Ответы [ 3 ]

1 голос
/ 20 февраля 2020

Предполагая python 2.7.17

Попробуйте этот подход:

import sys, StringIO

def funky() :
 "1" + 1 # This should raise an error

sys.stderr = StringIO.StringIO()
funky() # this should call the funky function

И ваш код должен выглядеть примерно так:

import sys, StringIO

# import kazoo somehere around here

sys.stderr = StringIO.StringIO()
kazoo_client.start()

И, наконец, Python 3 пример:

import sys
from io import StringIO
# import kazoo somehere around here

sys.stderr = StringIO()
kazoo_client.start()
0 голосов
/ 20 февраля 2020

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

import functools


# Use the Decorator Design Pattern

def ignore_error_decorator(function_reference):
    @functools.wraps(function_reference)  # the decorator inherits the original function signature
    def wrapper(*args):
        try:
            result = function_reference(*args)  # execute the function
            return result  # If the function executed correctly, return
        except Exception as e:
            pass  # Default ignore; You can also log the error or do what ever you want

    return wrapper  # Return the wrapper reference


if __name__ == '__main__':
    # First alternative to use. Compose the decorator with another function
    def my_first_function(a, b):
        return a + b

    rez_valid = ignore_error_decorator(my_first_function)(1, 3)
    rez_invalid = ignore_error_decorator(my_first_function)(1, 'a')
    print("Alternative_1 valid: {result}".format(result=rez_valid))
    print("Alternative_1 invalid: {result}".format(result=rez_invalid)) # None is return by the exception bloc

    # Second alternative. Decorating a function
    @ignore_error_decorator
    def my_second_function(a, b):
        return a + b


    rez_valid = my_second_function(1, 5)
    rez_invalid = my_second_function(1, 'a')
    print("Alternative_2 valid: {result}".format(result=rez_valid))
    print("Alternative_2 invalid: {result}".format(result=rez_invalid))  # None is return by the exception bloc

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

ignore_error_decorator(kazoo_client.start)()
0 голосов
/ 20 февраля 2020

Если вы знаете исключение, попробуйте contextlib.suppress:

>>> from contextlib import suppress
>>> x = (i for i in range(10))
>>> with suppress(StopIteration):
...     for i in range(11):
...         print(next(x))

0
1
2
3
4
5
6
7
8
9

Без подавления выдается ошибка StopIteration на последней итерации.

>>> x = (i for i in range(10))

>>> for i in range(11):
...     print(next(x))

0
1
2
3
4
5
6
7
8
9
Traceback (most recent call last):

  File "<ipython-input-10-562798e05ad5>", line 2, in <module>
    print(next(x))

StopIteration

Suppress - это Pythoni c, безопасный и явный.

Итак, в вашем случае:

with suppress(SomeError):
    kazoo_client.start()

EDIT:

Чтобы подавить все исключения:

with suppress(Exception):
    kazoo_client.start()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...