Найти - Пользователи
Полная версия: Простой логгер исключений
Начало » Python для новичков » Простой логгер исключений
1 2
Podarok
Пытаюсь написать простой логгер исключений.

Есть скрипт:
 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 ведет себя так странно и как реализовать ожидаемое поведение?
FishHook
    
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=
Podarok
Так и есть. Я тоже это делал, но это не решает проблему.
JOHN_16
 >>> 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
>>> 
Вы этого хотите?
FishHook
Podarok
Так и есть. Я тоже это делал, но это не решает проблему.
А какая проблема то? Тот факт, что ваши ожидания не соответствуют реализации чужого метода, это не проблема, это ваше непонимание чужого метода. Из этих строк без проблем можно собрать любой формат вывода, какой хотите.
Podarok
FishHook
А какая проблема то?
Вот проблема:
Podarok
как реализовать ожидаемое поведение
А по поводу
FishHook
без проблем можно собрать любой формат вывода
Собрать-то, конечно, можно, но я думал, что есть более элегантное решение.
Podarok
JOHN_16
У вас либо ошибка в коде, либо вы не весь код показываете, потому что ни модуль ни класс нигде не используются.
Скорее всего вы пропустили sys.stderr = ErrorStream().

JOHN_16
Вы этого хотите?
Почти. Нужно то же самое, только чтобы до и после исключения вставлялась пустая строка.
JOHN_16
Podarok
Добавьте еще по принту пустой строки до и после основного принта и будет что вы хотите
Podarok
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
-
-
-
Vladimirv
Podarok
А зачем это нужно?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB