【问题标题】:quit function does not work in try-except block退出功能在 try-except 块中不起作用
【发布时间】:2015-11-11 15:06:36
【问题描述】:

这是退出函数,我想在 try except 块中运行它..

def quit_function(quit):
     if(quit=="quit"):
        sys.exit(1)

当我输入正确的输入时,它起作用 function_one 但是当我写“exit”以退出程序时,quit_function 不起作用,除了部分起作用,所以输出是“无效输入”..我该如何解决它?

 while True:
    try:
        a=raw_input("Enter input :").lower()
        function_one(a)
        quit_function(a)
    except:
        print "invalid input"
    else:
        break

【问题讨论】:

  • 而这,未来的读者,这就是为什么你永远永远只写except子句。
  • 从不使用纯except:总是指定异常的类型:except ValueError:except (ValueError,TypeError,IndexError):

标签: python function try-except


【解决方案1】:

exit 产生一个 SystemExit,它继承自 BaseException

您正在except 块中找到出口。尝试使except 更具体,只捕获正常异常(而不是退出信号):

try:
   ...
except Exception:
   print "Invalid input"

更好的是,找出您需要捕获的实际特定类型的异常,然后只捕获它。

【讨论】:

    【解决方案2】:

    我将假设 当我写“退出”时实际上意味着 当我写“退出”时,因为您的函数会查找字符串 "quit"

    首先,因为你有一个通用的except 块,你看不到实际的Exception 是什么,所以我敢打赌function_one("quit") 会抛出一个Exception。你需要在function_one()之前处理quit_function()

    其次,sys.exit() 也会引发一种特殊类型的异常,因此 except: 不会消除它。

    按照这些思路应该可以工作:

    while True:
        try:
            a=raw_input("Enter input :").lower()
            quit_function(a)
            function_one(a)
        except Exception:
            print "invalid input"
        else:
            break
    

    【讨论】:

      【解决方案3】:

      sys.exit 函数实际上引发了一个特殊的SystemExit 异常,它将向上传播堆栈,在执行过程中执行 finally 块 try 语句,直到异常被捕获或到达堆栈顶部。在后一种情况下,python 干净地退出,而不是打印回溯。为避免捕获SystemExit 异常,请将您的裸except 语句更改为except Exception 或更具体的内容。或者,如果您确实需要在没有运行异常处理程序的情况下立即退出,您可以使用os._exit

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多