У мене є функція, яка може повернути одну з трьох речей:
- успіх (
True) - провал (
False) - помилка читання / розбору потоку (
None)
Моє запитання: якщо я не повинен проходити тестування проти, Trueабо Falseяк я повинен бачити, який результат? Нижче описано, як я зараз це роблю:
result = simulate(open("myfile"))
if result == None:
print "error parsing stream"
elif result == True: # shouldn't do this
print "result pass"
else:
print "result fail"
це насправді так просто, як видалити == Trueчастину чи слід додати тип даних трибулевого типу. Я не хочу, щоб simulateфункція кидала виняток, оскільки все, що я хочу, щоб зовнішня програма робила помилку - це занотувати її та продовжувати.
simulateфункції я вловлюю всі винятки; Я не хочу, щоб все, що відбувається всередині симулятора, зупиняло роботу всієї програми (та обробку наступного елемента). Але відповіді змушують мене змінити свою думку.
simulateє речі, які він може зловити і повторити, це добре. Але якщо вона "провалюється", вона не повинна повертатися None. Він повинен просто створити виняток із сценарію, який його назвав. Так чи інакше, simulateробиться. Повернення Noneне є настільки корисним, як підняття належного винятку - або дозволити розповсюдженню виключення simulateв сценарій виклику для обробки.
except Exception:замість цього. Це фіксує всі "реальні" помилки, разом із Warningта StopIteration. Це дозволяє KeyboardInterruptі SystemExitчерез те, хоча. Якщо ви дійсно хочете їх впіймати, можливо, найкраще скористатися іншою, зовнішньою спробою / за винятком або якоюсь іншою структурою, яка чітко документує ваш намір, оскільки це не "помилки". (Але я сказав "майже ніколи" ... можливо, у вашому випадку ви дійсно хочете схопити все, і навіть завадите Ctrl-C або sys.exit()вийти, і т. Д.)