Python 是否可以取消尚未捕获的异常?

Python 是否可以取消尚未捕获的异常?,python,exception-handling,Python,Exception Handling,我想使用自定义sys.excepthook。当程序抛出异常时,会调用sys.except钩子并执行一些操作 例如: import sys def ehook(exctype, value, traceback): t = 'Keys' if exctype == AttributeError and value.args[0].split("'")[1] == t: print "t %s" % (t,) else: sys.__excep

我想使用自定义sys.excepthook。当程序抛出异常时,会调用sys.except钩子并执行一些操作

例如:

import sys
def ehook(exctype, value, traceback):
    t = 'Keys'
    if exctype == AttributeError and value.args[0].split("'")[1] == t:
        print "t %s" % (t,)
    else:
        sys.__excepthook__(exctype, value, traceback)

sys.excepthook = ehook



class Keys():
    @staticmethod
    def x():
        print "this is Keys.x()"


if __name__ == "__main__":
    Keys.x()
    Keys.noexist()
    print "I want to continue here and beyond..."

有没有办法取消excepthook中的活动异常,这样它就不会导致程序退出?

否。在调用
sys.excepthook
时,该异常在顶层已经取消,程序将在
sys.excepthook
完成其工作后退出。(请参阅。)一般来说,异常在Python中是不可恢复的:您必须在捕获它们的地方处理它们,不能从它们发生的地方继续。有关讨论,请参阅


编辑:根据您的评论,听起来您并不是在试图捕获整个程序中的所有异常。您只想捕获某些对象上未定义的属性查找。如果是这种情况,只需在类上定义一个。否。在调用
sys.excepthook
时,该异常在顶级已取消捕获,程序将在
sys.excepthook
完成其工作后退出。(请参阅。)一般来说,异常在Python中是不可恢复的:您必须在捕获它们的地方处理它们,不能从它们发生的地方继续。有关讨论,请参阅


编辑:根据您的评论,听起来您并不是在试图捕获整个程序中的所有异常。您只想捕获某些对象上未定义的属性查找。如果是这种情况,只需在类上定义一个。是否要处理所有异常,或
keyrerror
s、
AttributeError
s等等?仅处理AttributeError。我试图实现的是一种允许用户调用Keys.group()、Keys.revert()等的方法,其中Keys方法group()、revert()是未定义的,但我可以捕获这些未定义的方法名称,并使用它们返回使用这些名称的内容。类似于return str(“keyname”+未定义的名称”)。我想避免使用try-except子句。@DaveKierans:听起来你在寻找
\uuu getattr\uuuu
。请看我编辑的答案。@BrenBarn谢谢:我会试试,看看是否能让它工作-到目前为止,我的第一次尝试是给我一个无限循环。我想我需要对getattr\uu的返回进行工作。所以它会返回一些有用的东西,可以调用,但做我想做的。我会继续尝试。你想处理所有异常,还是
KeyError
s、
AttributeError
s等等?只是AttributeError。我试图实现的是一个允许用户调用Keys.group()、Keys.revert()之类的东西等等,其中Keys-methods-group()、revert()是未定义的,但我可以捕获这些未定义的方法名,并使用它们返回使用这些名称的内容。我想避免使用try-except子句。@DaveKierans:听起来你在找
\uuu getattr\uu
。查看我编辑过的答案。@BrenBarn谢谢:我会试试这个,看看是否能让它工作-到目前为止,我的第一次尝试是给我一个无限循环。我想我需要对getattr_uu的返回进行处理,因此它会返回一些有用的东西,这些东西是可以调用的,但是可以实现我想要的。我会继续尝试。