这是代码 - 非常简单 - 但它在程序的主要部分无限地给了我第一个例外 - 甚至没有要求用户输入我认为它应该在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
答案 0 :(得分:1)
首先,我将对您的代码提供大量关键反馈。请记住,我不是这样做是为了滥用你的错误编码,我这样做完全基于教学目的,只是试图告诉你更好的方法来做你做过的事情
执行下面列出的内容将解决您的问题,但只会导致它删除整个try
- 阻止。所以这不是你问题的直接答案,即使我花时间在这上面,我实际上并没有要求接受答案。我只是(无聊)试图帮助一个初学者。
并非所有这些都是错误,它们不是做你正在做的事情的最好方法。对于一个初学者来说,你的代码实际上并没有那么糟糕,但总有新的东西需要学习,而且这里有一些与你的代码相关的东西:
<强> 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 强>
您的changeAttribute()
方法对我来说似乎毫无用处。而不是调用peopleList[-1].changeAttribute(name, None, None)
,你可以peopleList[-1].name = name
来获得完全相同的结果,而不是使用无用的方法。
<强> 4。 peopleList [-1] 强>
使用peopleList[-1]
获取对象也不是一个好方法,而是应该在主函数person = details()
的第一行定义一个新人(我也会将详细信息重命名为Person,但是你的调用)和每个for循环内部,只需说出person.name = name
并用你得到的任何细节替换名称。完成所有for循环后,调用peopleList.append(person)
。您还可以将代码的第一行中的人员定义留下,将用户的姓名,地址和编号放入临时局部变量,然后在最后一行调用peopleList.append(details(name, address, number))
,尽管第一种方法是可推荐的。
<强> 5。 CamelCaseClassNames 强>
正如我在评论中已经提到的,你应该为你的类使用CamelCaseNaming(而不是class details:
做class Details:
)。这不是任何可能的错误,它甚至不是一个错误,但最好使用CamelCasing,以便其他程序员也能理解你的代码。这只是程序员的习惯,是全球用来命名类的方法。
答案 1 :(得分:0)
Mahi做了很好的工作,你应该改进你的程序,我想你会发现如果你遵循他的建议并编写更简单,更易读的代码,你会得到更少的棘手错误。
但我想回答你的具体问题:
每次在相应的except (Exception)
块中发生异常时,try
块都会执行,而不是在您明确提出未命名的异常时。为了避免这种情况,你应该提出并捕获一个特定的例外。
我能够重现无限循环的唯一方法是使用Ideone.com online interpreter,它不会提示输入(你必须提前输入输入)。这引发了一个EOFError异常,它被你的except
捕获,并导致无限循环。我怀疑你做了类似的事情(或者做了一些引发异常的事情)。