Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 1, 2018 12:11:21

Podarok
Зарегистрирован: 2017-08-12
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Простой логгер исключений

Пытаюсь написать простой логгер исключений.

Есть скрипт:

 import sys
class ErrorStream:
    def write(self, arg):
        print(arg)
sys.stderr = ErrorStream()
a = 1/0

Ожидаемый вывод:
 Traceback (most recent call last):
  File "D:\Coding\Python\Programs\Tests\test.py", line 1, in <module>
    a = 1/0
ZeroDivisionError: division by zero

Реальный вывод (тире вставлено на месте пустых строк):
 Traceback (most recent call last):
-
  File "D:\Coding\Python\Programs\Tests\test.py", line 8, in <module>
-
-
a = 1/0
-
-
ZeroDivisionError
:
division by zero
-
-
При чем каждая строка вывода это отдельный вызов print.

Почему sys.strderr ведет себя так странно и как реализовать ожидаемое поведение?

Офлайн

#2 Фев. 1, 2018 12:23:10

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Простой логгер исключений

    
import sys
class ErrorStream:
    def write(self, arg, **kawrgs):
        print("Args=", arg)
sys.stderr = ErrorStream()
a = 1/0

    
Args= Traceback (most recent call last):
Args=   File "/Users/asmirnov/PycharmProjects/test/test.py", line 6, in <module>
Args=     
Args= a = 1/0
Args= 
Args= ZeroDivisionError
Args= : 
Args= division by zero
Args=



Офлайн

#3 Фев. 1, 2018 12:51:28

Podarok
Зарегистрирован: 2017-08-12
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Простой логгер исключений

Так и есть. Я тоже это делал, но это не решает проблему.

Офлайн

#4 Фев. 1, 2018 12:59:24

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Простой логгер исключений

 >>> import sys
>>> class ErrorStream:
...     def write(self, arg):
...         print(arg, end='')
... 
>>> 1/0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 
Вы этого хотите?



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Фев. 1, 2018 13:19:01

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Простой логгер исключений

Podarok
Так и есть. Я тоже это делал, но это не решает проблему.
А какая проблема то? Тот факт, что ваши ожидания не соответствуют реализации чужого метода, это не проблема, это ваше непонимание чужого метода. Из этих строк без проблем можно собрать любой формат вывода, какой хотите.



Офлайн

#6 Фев. 1, 2018 13:38:08

Podarok
Зарегистрирован: 2017-08-12
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Простой логгер исключений

FishHook
А какая проблема то?
Вот проблема:
Podarok
как реализовать ожидаемое поведение
А по поводу
FishHook
без проблем можно собрать любой формат вывода
Собрать-то, конечно, можно, но я думал, что есть более элегантное решение.

Офлайн

#7 Фев. 1, 2018 13:54:36

Podarok
Зарегистрирован: 2017-08-12
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Простой логгер исключений

JOHN_16
У вас либо ошибка в коде, либо вы не весь код показываете, потому что ни модуль ни класс нигде не используются.
Скорее всего вы пропустили sys.stderr = ErrorStream().

JOHN_16
Вы этого хотите?
Почти. Нужно то же самое, только чтобы до и после исключения вставлялась пустая строка.

Офлайн

#8 Фев. 1, 2018 14:39:00

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Простой логгер исключений

Podarok
Добавьте еще по принту пустой строки до и после основного принта и будет что вы хотите



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#9 Фев. 1, 2018 17:46:40

Podarok
Зарегистрирован: 2017-08-12
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Простой логгер исключений

JOHN_16
Если бы все было так просто, я бы сюда не писал)
Этот код

 import sys
class ErrorStream:
    def write(self, arg):
        print("\n", end="")
        print(arg, end="")
        print("\n", end="")
sys.stderr = ErrorStream()
a = 1/0

Работает так
 -
Traceback (most recent call last):
-
-
  File "D:\Coding\Python\Programs\Tests\test.py", line 11, in <module>
-
-
-   
-
a = 1/0
-
-
-
-
ZeroDivisionError
-
: 
-
division by zero
-
-
-

Офлайн

#10 Фев. 1, 2018 22:56:02

Vladimirv
Зарегистрирован: 2013-03-22
Сообщения: 108
Репутация: +  7  -
Профиль   Отправить e-mail  

Простой логгер исключений

Podarok
А зачем это нужно?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version