2013-07-24 2 views
0

Это простая программа, над которой я работаю, чтобы изучить python, потому что я новичок. Как бы добавить исключение, если пользователь вводит что-то другое, что y, Y, n, N. Я искал везде, но не могу найти, какое исключение использовать? Спасибо за помощь каждого.Python добавляет исключение (отредактировано)

EDIT: Я скорректировал свой код. Единственное, что не работает, - if (welcomeString.strip(). Lower()! = 'N' или 'y'): welcomeString = input ('Недействительный выбор \ nВы хотите изменить строку? (г/л): '). Он не реализует типы пользователей в y или n. Однако это работает и для других букв.

EDIT2: Все работает так, как ожидается, пока пользователь не вводит неверный вход во второй раз. В первый раз он скажет «Не правильный выбор», но во второй раз программа выйдет.

import sys 

welcomeString = input('Welcome to String Reverser\nWould you like to reverse a string?(y/n)') 

if not welcomeString.strip().lower() in ['n','y']: 
    welcomeString = input('Not a valid choice\nWould you like to reverse a string?(y/n):') 

if welcomeString.strip().lower() == 'n': 
    print("Thanks for using String Reverser") 

while welcomeString.strip().lower() == 'y': 
    myString = input("What string would you like to reverse?:") 
    ReverseString = myString[::-1] 
    print (("Your Reversed String is %s") % ReverseString) 
    welcomeString = input("Would you like to reverse another string(y/n)") 
+0

http://docs.python.org/2/tutorial/errors.html#handling-exceptions – wflynny

+0

Название говорит «обработка исключений», а ваше описание говорит «добавив исключение» , Что ты пытаешься сделать? Если вы хотите создать исключение, термин, который вы должны использовать Google, - это «создать исключение». Кроме того, ваше использование пока не так, возможно, вы собираетесь использовать здесь elif. –

+3

Совет: используйте 'welcomeString.lower(). Startswith ('y')' вместо 'welcomeString.startswith (" y ") или welcomeString.startswith (" Y ")' –

ответ

1

В этом случае, если вы на самом деле не необходимо исключение. Исключение составляет исключительный случай, который предотвращает продолжение программы, если он все еще может продолжаться, но при определенных обстоятельствах из-за пользовательского ввода или условий он может использовать предупреждение, чтобы сигнализировать об этом.

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

Если вы решили использовать исключение:

Вы можете посмотреть here для получения более подробной информации о том, как использовать исключение и here для того, как подкласс исключения и сделать определенный пользователь исключения

Таким образом, вы можете сделать 3 вещи:

1) есть утверждение - это вызовет ошибку утверждения с текстом, как заявление будет рассматриваться как ошибка

a = 1 
b = 2 
assert a==b, "A does not Equal B" 

Утверждение обычно используется для проверки границ. assert index> = 0 и, как правило, отсутствует критический, но вы можете использовать их для тестирования, если это ваш личный код.

для вашего случая у вас может быть оператор switch/if-else, как вы сейчас делаете/выполняете операции. Так как @Ketouem говорит выше, у вас может быть список всех букв и чеков или dict (если бы у вас было больше таких букв, как 100, это было бы немного быстрее).

Питона вика дает общие рекомендации для хороших видов использования утверждает:

Места рассмотреть вопрос о создании утверждений:

  • проверку типов параметров, классов или значениями
  • проверки структуры данных инвариантов
  • проверка ситуации «не может произойти» (дубликаты в списке, противоречивые переменные состояния.)
  • после вызова функции, чтобы убедиться, что его возвращение разумно

    - Python Wiki

2) Вы можете использовать один из встроенных исключений (смотрите here) и поднять один из тех; например

if(condition_not_met): 
    raise ValueError("You did not enter a correct option") 

Они, как правило, имеют в виду specific uses.

3) Вы можете делать то, что делать Numpy и многие библиотеки и создавать свои собственные исключения (вы также можете использовать библиотеки, такие как Numpy-х LinAlgError, но если вы вручную отлова и Повторное выбрасывание обычно они имеют домен конкретных применений.

Чтобы создать свое собственное исключение, вы должны создать подкласс Exception не BaseException

например

class MyInputError(Exception): 
    def __init__(self, value): 
     self.value = value 
    def __str__(self): 
     return repr(self.value) 

, а затем вызвать эту

if(condition_not_met): 
    raise MyInputError("Wrong input. Please try again") 

наконец, вы всегда можете использовать, если тогда это и другие структуры управления, а затем выход - но это не то, что распространено в Python и чаще встречается в таких языках, как C.

В общем, пытаясь что-то и ловя ошибки является одним из нескольких ключевых парадигм в Python:

ЭСПЦ Легче попросить прощения, чем разрешения. Этот общий стиль кодирования Python предполагает наличие допустимых ключей или атрибутов и ловит исключения, если предположение оказывается ложным. Этот чистый и быстрый стиль характеризуется наличием множества попыток и исключений, кроме . Этот метод контрастирует со стандартом LBYL, общим для многих другими языками, такими как C.

- Python Glossary

+0

Большое спасибо за подробное описание и объяснение того, что происходит. Это действительно полезно для нуба, подобного мне. – Hartbypass

-2

Вы можете использовать старые добрые»как утверждают, чтобы сделать некоторые проверки, которые будут бросаться AssertionError если условие ложно

assert welcomeString not in ['n', 'N', 'y', 'Y'], "Validation Failed" 

В качестве альтернативы вы можете поднять ValueError

if welcomeString.lower() not in ['n', 'y']: 
    raise ValueError("Invalid User Input") 
+1

Утверждения предназначены для проверки того, что должно быть невозможно. Утверждение не является правильным выбором здесь. – user2357112

+1

-1, вы никогда не захотите использовать assert для проверки ввода пользователя. – Taymon

+0

'assert's всегда странны для меня, я никогда не использовал их; что это? –

4

Недопустимый ввод пользователя обычно не должен приводить к генерированию исключения. Исключения для исключительных условий. Это не жесткое правило, и вы можете утверждать, что некоторые стандартные исключения не следуют за ним, но способ справиться с такой проверкой ввода пользователем - это регулярное управление потоком. Используйте инструкцию if, чтобы проверить, действительно ли она действительна, и если это не так, попросите их снова или предпримите другие разумные действия.

+0

Спасибо, это помогло alot – Hartbypass

0
while True: 
    if welcomeString.strip().lower() == 'y': 
     ... 
    elif welcomeString.strip().lower() == 'n': 
     ... 
     break    
    else: 
     ... 
     print("some error message") 
sys.exit() 

, безусловно, самое элегантное решение, на мой взгляд. Если вы используете использовать python2 raw_input в противном случае вы получите сообщение об ошибке, так как вход пользователя также может быть целочисленного типа, теркой или BOOL (в качестве альтернативы для питона 2 можно также использовать, если welcomeString in ['y', 'Y', 'N','n']:.

1

Что касается вашего редактирования, поэтому ваш код не работает:

if(welcomeString.strip().lower() != 'n' or 'y'):

Это не правильный способ использования or. Он имеет значение:

if(welcomeString.strip().lower() != ('n' or 'y')):

, который вычисляет:

if(welcomeString.strip().lower() != 'n'):

, который не то, что вы хотите. Используйте вместо этого:

if not welcomeString.strip().lower() in ['n', 'y']:

+0

Спасибо, что поняли. – Hartbypass

Смежные вопросы