Python 3函数内异常处理问题:双向链表函数NameError捕获失效
为什么你的双向链表函数捕获不到NameError?
我来帮你捋清楚这个问题的根源——你遇到的情况其实是Python的异常触发时机导致的:
当你执行d = addToHeadDLL(4, e)时,Python在调用函数之前就会先对所有参数进行求值。此时e是一个未定义的变量,所以NameError在这个阶段就直接触发了,根本没机会进入到addToHeadDLL函数里的try-except块。
再看你函数里的try逻辑:
try: name = DoublyLinkedList(element) except NameError: print('Please enter correct parameters')
这里的NameError只能捕获DoublyLinkedList这个类未定义的情况(比如你不小心拼错了类名),完全管不到函数调用时参数本身的未定义问题——因为参数求值是在函数执行前完成的。
而你测试的另一个“能正常捕获异常的函数”,应该是异常是在函数内部代码执行时触发的(比如函数里用到了某个未定义的变量),所以能被内部的try-except捕获到,和这个场景完全不同。
怎么解决这个问题?
如果想处理“传入未定义变量”这种情况,你需要把try-except放在函数调用的外部,而不是函数内部:
try: d = addToHeadDLL(4, e) except NameError: print('Please enter correct parameters')
或者,你可以在调用前先检查变量是否存在(比如用'e' in locals()或'e' in globals()),但这种写法不太推荐,更合理的方式是确保调用函数时传入的参数都是已定义的。
内容的提问来源于stack exchange,提问作者Rorschach
相关产品推荐
相关产品推荐

