Python添加异常(已编辑)

时间:2013-07-24 00:54:30

标签: python

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

编辑:我调整了我的代码。唯一不起作用的是 if(welcomeString.strip()。lower()!='n'或'y'):   welcomeString = input('不是一个有效的选择\ 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)")

5 个答案:

答案 0 :(得分:4)

无效的用户输入通常不会导致抛出异常。例外情况适用于特殊情况。这不是一个严格的规则,您可能会认为某些标准异常不遵循它,但处理此类用户输入验证的方法是常规流控制。使用if语句检查它是否有效,如果不是,请再次询问或采取其他明智行动。

答案 1 :(得分:1)

在这种情况下,您实际上不需要例外 - 例外往往是例外案例,如果它仍然可以继续但在某些情况下由于用户输入或它可能会使用警告来表明这一点。

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

如果您决定使用例外:

您可以查看here以获取有关如何使用异常的更多详细信息,并here查看如何子类化异常并进行用户定义的异常

所以你可以做三件事:

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

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

断言通常用于检查边界 - 例如断言索引> = 0并且往往缺少关键但如果它是您自己的个人代码,您可以使用它们进行测试。

对于您的情况,您可以拥有一个switch语句/ if-else链,就像您当前执行/设置操作一样。所以@Ketouem上面说的你可以有一个所有字母和支票或字典的清单(如果你有更多的字母,如100,这会稍快一点)。

Python wiki提供了断言良好用法的一般指导原则:

  

考虑放置断言的地方:

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

         

    - Python Wiki

  •   

2)您可以使用其中一个内置异常(查看here)和 raise 其中一个; e.g。

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

这些通常考虑specific uses

3)您可以执行Numpy和许多库所做的事情并创建自己的异常(您也可以使用Numpy的LinAlgError这样的库,但除非您手动捕获和重新抛出,否则它们通常具有特定于域的用途。

要创建自己的异常,您应该继承Exception not BaseException

e.g。

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和其他控制结构然后退出 - 但这在Python中并不常见,在C语言中更常见。

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

  

EAFP 比获得许可更容易请求宽恕。这种常见的Python编码风格假定存在有效的键或属性   如果假设被证明是假的,则捕获异常。这个干净而且   快速风格的特点是存在许多尝试和除外   声明。该技术与许多人共同的LBYL风格形成鲜明对比   其他语言,如C.

     

- Python Glossary

答案 2 :(得分: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']:

答案 3 :(得分: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,您也可以使用welcomeString in ['y', 'Y', 'N','n']:

答案 4 :(得分:-2)

您可以使用好的'assert进行一些验证,如果条件为假,将抛出AssertionError

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

或者你可以引发一个ValueError

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