0

这是一个简单的程序,我正在学习 python,因为我是初学者。如果用户键入 y,Y,n,N 以外的内容,我将如何添加异常。我到处搜索,但似乎找不到要使用的异常?感谢大家的帮助。

编辑:我调整了我的代码。唯一不起作用的是 if(welcomeString.strip().lower() != 'n' or 'y'): welcomeString = input('Not a valid choice\n你想反转一个字符串吗?(y /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)")
4

5 回答 5

4

无效的用户输入通常不应导致引发异常。例外是针对特殊情况。这不是一成不变的规则,您可能会争辩说某些标准异常不遵循它,但处理这种用户输入验证的方法是常规流控制。使用if声明来检查它是否有效,如果不是,请再次询问他们或采取其他一些明智的行动。

于 2013-07-24T01:03:55.503 回答
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']:

于 2013-07-24T03:47:02.443 回答
1

在这种情况下,您实际上并不需要异常 - 异常往往是阻止程序继续运行的异常情况,如果它仍然可以继续但在某些情况下由于用户输入或条件,它可能会使用警告来发出信号。

在这里,您可以使用任意数量的方法轻松检查输入并重复,直到您能够获得有效的输入:)。

如果你决定使用例外:

您可以在此处查看有关如何使用异常的更多详细信息,并在此处查看如何对异常进行子类化并生成用户定义的异常

所以你可以做 3 件事:

1)有一个断言 - 这将导致一个断言错误,您的文本作为被视为错误的语句

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

断言通常用于检查边界 - 例如断言索引> = 0并且往往会丢失关键但您可以使用它们来测试它是否是您自己的个人代码。

对于您的情况,您可以像当前一样拥有 switch 语句/ if-else 链/设置操作。因此,正如@Ketouem 上面所说,您可以列出所有字母和检查或字典(如果您有更多字母,例如 100,这会稍微快一些)。

Python wiki 给出了良好使用断言的一般准则:

考虑放置断言的地方:

  • 检查参数类型、类或值
  • 检查数据结构不变量
  • 检查“不可能发生”的情况(列表中的重复项、相互矛盾的状态变量。)
  • 调用函数后,确保它的返回是合理的

    -- Python 维基

2)您可以使用内置异常之一(看这里)并引发其中之一;例如

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

不过,这些通常都有特定的用途

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")

最后,您始终可以使用 if then 和其他控制结构然后退出 - 但这在 Python 中并不常见,在 C 等语言中更为常见。

一般来说,尝试某些东西并捕获错误是 Python 中更关键的范例之一:

EAFP请求宽恕比请求许可更容易。这种常见的 Python 编码风格假设存在有效的键或属性,如果假设被证明是错误的,则捕获异常。这种干净快速的风格的特点是存在许多 try 和 except 语句。该技术与许多其他语言(如 C)常见的 LBYL 风格形成鲜明对比。

-- Python 词汇表

于 2013-07-24T02:11:56.297 回答
0
while True:
    if welcomeString.strip().lower() == 'y':
        ...
    elif welcomeString.strip().lower() == 'n':
        ...
        break            
    else:
        ...
        print("some error message")
sys.exit()

在我看来,绝对是最优雅的解决方案。如果你使用的是 python2 ,raw_input否则你会得到一个错误,因为用户输入也可能是整数、浮点数或布尔类型(或者对于 python 2,你也可以使用 if welcomeString in ['y', 'Y', 'N','n']:.

于 2013-07-24T01:33:03.507 回答
-2

您可以使用良好的 ol' 断言进行一些验证,如果条件为假,则会抛出 AssertionError

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

或者,您可以提出 ValueError

if welcomeString.lower() not in ['n', 'y']:
    raise ValueError("Invalid User Input")
于 2013-07-24T00:58:31.487 回答