-2

这是代码 - 非常简单 - 但它给了我程序主要部分中的第一个异常 - 甚至没有要求用户输入我认为它应该在 - 在第一次输入时raw_input- 我是一个初学者总体上很好地掌握语言 - 有什么想法吗?谢谢

import re,sys

#program to take details of people name, address and telephone number from user
#user must specify number of people first

class details:
    def __init__(self,name=None,address=None,tel=None):
        self.name=name
        self.address=address
        self.tel=tel

    def changeAttribute(self,name=None,address=None,tel=None):
        if name!=None:
            self.name=name
        if address!=None:
            self.address=address
        if tel!=None:
            self.tel=tel



class main(): 

    peopleList =[]
    a=1

    while a==1:    
        try:

            numOfPeople = raw_input("enter number of people:")
            if re.search('[^0-9\n]', numOfPeople):
                raise Exception
        except (Exception):
            print ("illegal input ,must only be numbers - Please try again")
        else:
            numOfPeople=str(numOfPeople)
            a=0

    for i in range(0,numOfPeople):
        x=1
        while x==1:
            try:    

                name=raw_input("Please enter name")
                if re.search('[^a-zA-Z\n]',name):
                    raise Exception
            except (Exception):
                print("illegal name - Please use only letters")
            else:
                peopleList.extend(details(name))
                x=0

        x=1    
        while x==1:
            try:    

                address=raw_input("Please enter address")
                if re.search('[^a-zA-Z\n]',address):
                    raise Exception
            except (Exception):
                print("illegal name - Please use only letters")
            else:
                peopleList[-1].changeAttribute(None,address,None)
                x=0

        x=1    
        while x==1:
            try:    

                tel=raw_input("Please enter telephone number")
                if re.search('[^0-9]',tel):
                    raise Exception
            except (Exception):
                print("illegal name - Please use only numbers")
            else:
                peopleList[-1].changeAttribute(None,address,None)
                x=0
4

2 回答 2

1

首先,我将就您的代码提供很多重要的反馈。请记住,我这样做并不是为了滥用你的糟糕编码,我这样做纯粹是为了教学目的,只是想向你展示更好的方法来做你所做的事情。

执行我将在下面列出的操作将解决您的问题,但只会导致它删除整个try-block。因此,这不是您问题的直接答案,即使我花时间在这上面,我实际上并没有要求接受答案。我只是(无聊)试图帮助初学者。

并非所有这些都是错误,它们只是不是做你正在做的事情的最佳方法。对于初学者来说,你的代码实际上并没有那么糟糕,但总是有新的东西要学习,这里有一些与你的代码相关的东西:

1.“班主”

第一个问题,class main()你从头到尾都不见了:,我想这是一个函数,而不是一个类?更改它以def main():定义一个函数。类用于创建对象,函数用于完成简单的任务。

2. 例外

有十亿种方法可以从用户那里获取输入并检查它是否是有效输入。不幸的是,你的方式不是其中之一。这是执行 for 循环的一种方法:

for i in range(numOfPeople):

    # Get user's name
    name = raw_input("Please enter name: ")

    # While name has incorrect characters
    while re.search('[^a-zA-Z\n]',name):

        # Print out an error
        print("illegal name - Please use only letters")

        # Ask for the name again (if it's incorrect, while loop starts again)
        name = raw_input("Please enter name: ")

    # .extend is used for appending lists to other lists
    # details is a class, not a list, so use .append instead
    peopleList.append(details(name))

您也可以使用中断,或者我更喜欢的方式是创建一个返回值的函数......如果没有很好的理由,请不要使用异常,大多数时候它们只是在你的路上. i = 1此外,使用和等变量while i == 1:是不好的编码,而是while True:通过调用来执行和停止循环break,或者像我上面那样做。

正如我所提到的,这些只是实现此功能的几种方法,希望您能找到适合您的方法,但请尽可能保持简单。

3.更改属性

你的changeAttribute()方法对我来说似乎没用。而不是打电话给你,peopleList[-1].changeAttribute(name, None, None)你可以做得到peopleList[-1].name = name完全相同的结果,而不是使用无用的方法。

4.人员列表[-1]

使用peopleList[-1]获取对象也不是一个好方法,相反,您应该在 main 函数的第一行定义一个新人person = details()(我也会将详细信息重命名为 Person,但是您的调用)并在每个 for 循环中,只需说person.name = name和用你得到的任何细节替换名称。现在在所有 for 循环完成后,调用peopleList.append(person). 您也可以将人员定义从代码的第一行移开,将用户的姓名、地址和号码放入临时局部变量中,然后在最后一行 call peopleList.append(details(name, address, number)),尽管第一种方法是值得推荐的。

5. CamelCaseClassNames

正如我在评论中已经提到的,您应该为您的课程使用 CamelCaseNaming (而不是class details:do class Details:)。这无论如何都不是错误,甚至不是错误,但最好使用 CamelCasing 以便其他程序员也能理解您的代码。这只是程序员的一种习惯,是全球使用的命名类的方式。

于 2012-11-26T19:32:12.307 回答
0

Mahi 在改进程序方面做得很好,我认为如果你遵循他的建议并努力编写更简单、更易读的代码,你会发现你会发现更少的棘手错误。

但我想回答你的具体问题:

except (Exception)每次在相应的块中出现异常时,您的块都会执行try,而不仅仅是在您明确提出未命名的异常时。为避免这种情况,您应该引发并捕获特定异常。

我可以重现您的无限循环的唯一方法是使用Ideone.com 在线解释器,它不会提示输入(您必须提前输入输入)。这引发了一个 EOFError 异常,该异常被您的 捕获except,并导致了无限循环。我怀疑你做了类似的事情(或者做了一些引发异常的事情)。

于 2012-11-26T19:58:28.390 回答