Хотите, чтобы мой код вызывал определенный тип или ошибку, но напечатайте оригинальную ошибку

Это использует ответ капитана Огумца , но с двумя дополнениями.

1), позволяя функции получать не научные номера нотации и просто возвращать их как есть (так что вы можете добавьте много ввода, что некоторые из чисел - 0,00003123 против 3.123e-05 и все еще имеют функцию работы.

2) добавлена ​​поддержка отрицательных чисел. (в исходной функции отрицательное число получится как 0,0000-108904 от -1.08904e-05)

def getExpandedScientificNotation(flt):
    was_neg = False
    if not ("e" in flt):
        return flt
    if flt.startswith('-'):
        flt = flt[1:]
        was_neg = True 
    str_vals = str(flt).split('e')
    coef = float(str_vals[0])
    exp = int(str_vals[1])
    return_val = ''
    if int(exp) > 0:
        return_val += str(coef).replace('.', '')
        return_val += ''.join(['0' for _ in range(0, abs(exp - len(str(coef).split('.')[1])))])
    elif int(exp) < 0:
        return_val += '0.'
        return_val += ''.join(['0' for _ in range(0, abs(exp) - 1)])
        return_val += str(coef).replace('.', '')
    if was_neg:
        return_val='-'+return_val
    return return_val

3
задан Sanyash 5 April 2019 в 20:13
поделиться

3 ответа

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

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

поймать что-нибудь

try...except Exception as e

повысить предпочтительную ошибку

raise AssertionError()

получить сообщение

e.message

получить тип

type(e)

] Собираем все вместе:

try:
    # some code that raises an error
    g = 10 + '11'
except Exception as e:
    raise AssertionError('{}: {}'.format(type(e), e.message))

Вывод будет:

<type 'exceptions.TypeError'>: unsupported operand type(s) for +: 'int' and 'str'

Это можно очистить, чтобы избавиться от уродливого вывода type(e), но В общем случае, именно так вы бы включили тип ошибки и соответствующее сообщение.

0
ответ дан osonuyi 5 April 2019 в 20:13
поделиться

Вы ищете синтаксис from (введен в Python 3), который позволяет обернуть исключение для конкретного приложения вокруг базового исключения. Вот пример:

>>> try:
...     1 > '1'
... except TypeError as e:
...     raise AssertionError() from e
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
TypeError: '>' not supported between instances of 'int' and 'str'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
AssertionError

Вы можете указать строку, содержащую диагностическое сообщение, когда вы создаете новое исключение. Было бы лучше определить свои собственные исключения для конкретного приложения, а не перерабатывать AssertionError. Если вы определите несколько, сделайте одного из них [grand] родительским, а другие исключения наследуются от этого предка. Это позволяет вызывающим абонентам удобно ловить мелкие или грубые классы ошибок.

Существует PEP , который описывает дальнейшие соображения.

0
ответ дан osonuyi 5 April 2019 в 20:13
поделиться

Также вы можете скрыть оригинальную трассировку, установив __suppress_context__ = True и выполнить некоторое форматирование в соответствии с вашими ожидаемыми результатами:

try:
    a = '1' > 1
except Exception as exc:
    assertion_exc = AssertionError('exception = {}: {}'.format(type(exc).__name__, str(exc)))
    assertion_exc.__suppress_context__ = True # comment this line to see full traceback
    raise assertion_exc

Полный вывод:

Traceback (most recent call last):
  File "./file.py", line 8, in <module>
    raise assertion_exc
AssertionError: exception = TypeError: '>' not supported between instances of 'str' and 'int'
0
ответ дан Sanyash 5 April 2019 в 20:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: