Это использует ответ капитана Огумца , но с двумя дополнениями.
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
Вам нужно поймать поднятое исключение, а затем поднять тот тип, который вы хотите. Так как вы упомянули, что хотите поймать любой тип ошибки, вы должны будете использовать класс 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)
, но В общем случае, именно так вы бы включили тип ошибки и соответствующее сообщение.
Вы ищете синтаксис 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 , который описывает дальнейшие соображения.
Также вы можете скрыть оригинальную трассировку, установив __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'