python基础知识,为什么异常处理不起作用?

时间:2018-02-16 15:33:24

标签: python python-3.x pycharm

是python开发的新手,并试图理解异常处理。 我有2个函数1st在列表中找到1个重复值,第2个调用该函数。 但是如果尝试传递不存在的列表名称,则应该从块除外打印消息,但是它不起作用,请帮助

def first_duplicate(a):
    x = 0
    for i, j in enumerate(a):
        for k in a[i + 1:]:
            if j == k:
               x = 1
                return j
        if x == 1:
            break


def call_main (list_name):
    try:
        x = first_duplicate(list_name)
        if x is None:
            print("No duplicates")
        else:
            print(x, "is the first duplicate")
    except NameError:
            print("exception occurred Name ")
    except ValueError:
            print("exception occurred value")

我的命令就像

call_main(y)

我还没有创建列表:y,它应该在这种情况下打印异常消息,但不是,请帮助

2 个答案:

答案 0 :(得分:2)

这是一个例子。在下面的代码中,try中有一个名称y,它不是输入,因此会引发NameError例外。

t=[11]; function(t);会引发NameError

t=(1,2); function(t)会引发AttributeError ..因为x.append(5)首先被捕获。

def function(x):
    try :
      x.append(5);
      x+y
    except NameError:
      print("name error exception")
    except AttributeError:
      print("attribute error excetption")

t=[11];
function(t)

t=(1,2)
function(t)

现在,如果您致电function(a_list),但a_list尚未定义,则会提出默认NameError因为错误发生在函数内部代码处理之前。因此try甚至没有被处理。我认为这可以解释为什么你得到默认的NameError

如果您希望它生成NameError,您还可以(另外)在功能范围之外设置try

try :
    call_main(y);
except NameError:
    print("something");

答案 1 :(得分:2)

从根本上说,在您编写的任何代码中,try: except块只能捕获其中传递的行的错误。如果在函数调用中发生错误(或实际包含try: except块的代码),则错误发生在测试之前,因此无法捕获错误。

这就是为什么在将参数传递给函数之前(或通过函数调用本身的语法)捕获由参数引起的错误,如call_main(y)中那样,必须移动错误处理在这个功能之外,其他人在这里用代码证明:

try:
     call_main(y)
except NameError:
     print("exception caught a NameError")

异常处理只能做很多事情。在某些时候,程序员必须证明他们的代码,并确保它的工作原理。在相关的说明中,最好的做法是在try: except块中包含一般异常语句,以捕获尚未测试或尚未考虑的任何意外错误。对您的代码进行以下修改演示了这一点以及如何让计算机准确地告诉您它捕获的错误:

def call_main (list_name):
    try:
        x = first_duplicate(list_name)
        if x is None:
            print("No duplicates")
        else:
            print(x, "is the first duplicate")
    except NameError:
            print("exception occurred Name ")
    except ValueError:
            print("exception occurred value")
    except Exception as ee:
            print(ee)
            print(type(ee))

最后一点 - 要证明您的异常处理有效,请对x = first_duplicate(list_name)进行以下编辑并重新运行。

x = first_duplicate(y)

结果:代码捕获名称错误

x = first_duplicate(0)

结果:捕获了常规异常并为您确定了错误类型