【问题标题】:Python NameError: name is not defined but can't capture the errorPython NameError:名称未定义但无法捕获错误
【发布时间】:2020-12-03 22:34:16
【问题描述】:
def strornum(a):
    try:
        return(a/1)
    except Exception:
        return("ERROR")
    
bob=strornum("W")
print(bob)

这给了我“错误”的正确错误

def strornum(a):
    try:
        return(a/1)
    except Exception:
        return("ERROR")
    
bob=strornum(W)
print(bob)

这没有得到处理,并给我“NameError: name 'W' is not defined” 我需要捕获这个错误

有什么想法吗?

【问题讨论】:

  • W的使用周围没有try/except,只是在bob=strornum(W)周围放一个,但这没有意义,因为变量在你编写脚本时是否定义,除非如果该变量在 if 块中定义 不要使用 NameError 做代码
  • 或者解释一下为什么你认为你需要抓住它
  • 错误发生在你调用函数之前。函数内部的try 怎么能捕捉到它?
  • "W" 表示一个字符的字符串,其唯一字符为WW 表示名为 W 的变量,显然没有定义。不必捕获 NameErrors,因为您在编写代码时应该已经知道代码中定义了哪些名称。
  • @PranavHosangadi 他知道这一点。他只是想让他的try/except 捕获未定义变量的错误。

标签: python nameerror


【解决方案1】:

你想要的都是不可能的。

当你调用一个函数时,所有的参数都会被计算函数中的代码被执行之前。 Python 不会等到您在函数内部引用参数变量(有些语言会这样做,这称为“惰性求值”)。

所以在进入 try/except 块之前,调用代码中会引发错误,所以它无法在那里捕获它。

【讨论】:

    【解决方案2】:

    运行失败的代码会给出回溯消息

    Traceback (most recent call last):
      File "test.py", line 7, in <module>
        bob=strornum(W)
    NameError: name 'W' is not defined
    

    错误是在您尝试调用函数时引发的,而不是在函数本身中。 W 未在调用时定义。解决方案是在该级别添加另一个异常处理程序。

    def strornum(a):
        try:
            return(a/1)
        except Exception:
            return("ERROR")
    
    try:
        bob=strornum(W)
        print(bob)
    except Exception:
        print("Outer Error")
    

    强制性警告:捕获所有异常通常不是一个好主意,因为它会掩盖代码中的实际问题。

    【讨论】:

      猜你喜欢
      • 2021-10-02
      • 1970-01-01
      • 2016-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-26
      相关资源
      最近更新 更多