#python #exception #nested
#python #исключение #вложенные
Вопрос:
Мне удалось создать хорошее меню на python с исключениями:
class InputError(Exception): pass
class DigitalIoTest(Exception): pass
class MotorEnableTest(Exception): pass
while True:
print("[1] Digital I/O Test")
print("[2] Motor Enable Test")
key = input("Please select test:")
try:
if key == '1': raise DigitalIoTest
elif key == '2': raise MotorEnableTest
else: raise InputError
except InputError:
print("Input error!")
except DigitalIoTest:
pass
except MotorEnableTest:
pass
Теперь мне нужно добавить еще один пункт меню [3], который выполняет все тесты в меню. Это то, что я пробовал до сих пор:
class InputError(Exception): pass
class DigitalIoTest(Exception): pass
class MotorEnableTest(Exception): pass
class AllTests: pass
while True:
print("[1] Digital I/O Test")
print("[2] Motor Enable Test")
print("[3] All Tests")
key = input("Please select test:")
try:
if key == '1': raise DigitalIoTest
elif key == '2': raise MotorEnableTest
elif key == '3': raise AllTests
else: raise InputError
except InputError:
print("Input error!")
except DigitalIoTest:
pass
except MotorEnableTest:
pass
except AllTests:
try:
raise DigitalIoTest
raise MotorEnableTest
except:
pass
Это работает не так, как предполагалось. Может кто-нибудь дать мне подсказку, как я могу добиться такого вложенного исключения для последовательного выполнения всех тестов?
Комментарии:
1. Подождите, что? Почему вы используете исключения для этого?
2. Потому что я не знаю, как сделать это другим способом, таким простым и элегантным (я имею в виду небольшой код и хорошую структуру).
3. Но … даже игнорируя предполагаемое использование исключений, это дополнительный уровень обработки попыток, кроме цепочки elif, которая могла бы справиться со всем сама по себе. Это сложнее, чем если бы вы не включали исключения в картину.
Ответ №1:
Вы используете исключения, чтобы указать, что должен делать обычный поток программы, что на самом деле не предназначено для исключений. Как насчет того, чтобы написать это так:
while True:
print("[1] Digital I/O Test")
print("[2] Motor Enable Test")
print("[3] All Tests")
key = input("Please select test:")
if key == '1':
do_what_you_need_for_1()
elif key == '2':
do_what_you_need_for_2()
elif key == '3':
do_what_you_need_for_3()
else: raise InputError
Если вам нужно вызвать более одной функции, то вызовите более одной функции. Зарезервируйте исключения для вещей, которые являются исключениями (например, ошибка ввода).
Комментарии:
1. Спасибо, это сработало бы. Но если я все же предпочел бы «исключительный» способ, есть ли решение для этого?
2. Я скучаю по инструкции «goto label» из старых времен программирования 🙂
3. @StefanWyss Использование goto давно известно как проблематичное, и есть причины избегать использования исключений для обычных потоков. Python, в частности, подчеркивает удобочитаемость. Это может быть хорошей возможностью для программирования в соответствии с принципами языка — среди прочего, другие найдут ваш код более читаемым и не вызывающим недоумения.
4. Вы меня убедили. Я буду использовать подход функционального меню. Спасибо!