Вместо пользовательской ошибки выводится ""

Делал программу, которая выбирает случайное число в заданном диапазоне с заданной точностью. Мой код:

import random

class PreciseError(Exception):
    def __init__(self, prec):
        self.prec = prec
    def __str__():
        return f'Expected integer or "max" precise, not {self.prec}' 
def choose(_min, _max, precise = 1):
    try:
        if precise == "max" or precise == int(precise):
            precise = 15

    except:
        raise PreciseError(precise) from None 
        # по идее, должен выводиться текст ошибки, но выводится "<exception str() failed>"
        exit()

    if _min < _max:
        _min *= 10 ** precise
        _max *= 10 ** precise
        (_min, _max) = (int(_min), int(_max))

        number = random.randint(_min, _max)
        number /= 10 ** precise

        if float(number) == int(number):
            number = int(number)

        if precise <= 0 and float(number) != int(number):
            number = round(number)

        return number

r = choose(1, 10, "min") # такой precise не допустим, должна вывестись ошибка
print(r)

Объясните, пожалуйста, почему это происходит и как это исправить?


Ответы (1 шт):

Автор решения: Amgarak

А добавить аргумент self вы часом не забыли?

def __str__(self):
    return f'Expected integer or "max" precise, not {self.prec}'

Собственно по этому и вываливается ошибка <exception str() failed>, потому что метод __str__() не может быть вызван без аргументов.

Собственно все работает, если добавить __str__(self):

PreciseError: Expected integer or "max" precise, not min

[Program finished] 
→ Ссылка