2017-07-27 89 views
-1

我有一个函数可以处理整数。如果输入了字符串或浮点数,我添加了异常处理代码,但是Python不断返回废话或NameError。在这一点上,我尝试了一个循环,不断询问,直到输入一个整数,然后输入tryexcept。什么都没有即使有异常处理,Python函数也会返回NameError

下面的代码:

def threes(num): 

    """isNotCorrect = True 

    while isNotCorrect: 
     print(type(num)) 
     if type(num) is not int: 
      print("Sorry, you need to enter a whole number to play Threes.") 
     else: 
      print('X') 
      isNotCorrect = False""" 

    try: 
     while num > 1: 
      if num % 3 == 0: 
       num = num/3 
      else: 
       if ((num + 1) % 3 == 0): 
        num = (num + 1)/3 
       else: 
        num = (num - 1)/3 
      print(num) 
    except NameError: 
     print("Invalid number. Please enter a valid number.") 

输入一个整数(预期输入)的罚款执行的代码,但一切导致名称错误这样,该输入是threes(bob)。最上面的部分是我的循环尝试,它也失败并返回相同的错误;

Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
NameError: name 'bob' is not defined 
+2

看来你还没有定义bob变量......你可以发布entiere代码吗? – Darkaird

+1

当你打电话给'三分线(bob)'而'bob'没有在任何地方定义时,你期望什么? – Tomalak

+1

该方法执行前引发异常('bob'不存在)。通过不输入方法,'try'' except'不被执行。另外,如果你想检查输入是一个数字,'Except'应该检查'TypeError',而不是'NameError'。 – AArias

回答

0

NameError: name 'bob' is not defined意味着你尝试使用一个名为bob的变量,但是你没有创建它。
你必须定义什么是bob这样的为例:
bob = 'a simple man' # bob is a string

bob = 4 # bob is an integer

而且,我只是想让你知道,即使它的工作原理,尽量避免使用try /除外,因为这当你必须输入除了区域时,它非常慢。

如果您要检查,如果你的变量是一个整数,我建议你使用:

if isinstance(bob, int): 
    # do something 
else: 
    # do something else 

isinstance()是一个内置的功能。

+0

很好的建议。如果异常事实上没有得到提升,例外情况会比等效的“if ... else”代码快,但如果您希望异常时间超过5-10%,那么代码运行速度会更快它使用'if ... else'代码。然而,使用'isinstance'比使用'type'好这种东西。 –

+0

@PM 2Ring是的,我忘了'isinstance',我编辑过。 关于'try ... except',我会补充一点,即使它小于5-10%(但不是很少),我更喜欢'if ... else',因为它更加稳定和可预测可以用于多处理目的(例如)。 – Darkaird

0

你的bob变量没有定义,所以你没有达到try/catch。

尝试decalring鲍勃与非数字bob = 'test_string'并重试。

0

问题是NameError正在从以外调出这个函数。当你说:

threes(bob) 

什么Python做是:

  1. 获取的bob值。
  2. 致电threes传递该值作为参数。

NameError在步骤1中引发,因此您甚至不会进入该功能。如果你还是想抓住它,你应该有外try/except块:

try: 
    threes(bob) 
except NameError: 
    print("NameError raised.") 
0

您发布简单的代码不能引发NameError。该错误可能来自您称之为threes函数的部分。如果您只写了threes(bob),那么如果先前未定义名为bob的变量,则会引发NameError。如果你想传递一个字符串,你应该调用你的函数,如:threes("bob")

相关问题