尝试/排除特定类型的所有Python错误

尝试/排除特定类型的所有Python错误,python,error-handling,try-catch,Python,Error Handling,Try Catch,在我的Python代码中,我使用PyQt5模块来显示GUI。有时,如果删除某个元素,然后尝试在该元素的实例上使用函数,则会遇到运行时错误。此错误仅显示在控制台中,实际上不会干扰GUI或终止GUI 无论如何,我想删除它(运行时错误)。我的第一个想法是在代码上使用try/except块,除了我所说的运行时错误。问题是,如果我用try/except块封装我的全部代码,那么如果捕获到错误,它将跳到程序的末尾并终止: 试试看: #如果这里发生任何错误。。。 除运行时错误外: #GUI将完全停止,Pyth

在我的Python代码中,我使用PyQt5模块来显示GUI。有时,如果删除某个元素,然后尝试在该元素的实例上使用函数,则会遇到运行时错误。此错误仅显示在控制台中,实际上不会干扰GUI或终止GUI

无论如何,我想删除它(运行时错误)。我的第一个想法是在代码上使用
try/except
块,除了我所说的运行时错误。问题是,如果我用try/except块封装我的全部代码,那么如果捕获到错误,它将跳到程序的末尾并终止:

试试看:
#如果这里发生任何错误。。。

除运行时错误外:
#GUI将完全停止,Python解释器将跳到这一行
通过
我的问题的另一个解决方案是使用
try/catch
块封装任何可能引发运行时错误的实例,如下所示:

试试看:
#如果这里发生任何错误。。。
<可能打印错误的代码>
除运行时错误外:
#Python不会显示错误
通过

然而,考虑到我需要在代码中执行此操作的大量次数,我想知道是否有更有效的方法来解决此问题。

您可以使用自定义装饰程序来解决此问题(我不知道您的python级别,但这不是最适合初学者的方法)。例如,此处的代码不会引发任何错误:

from functools import wraps

def IgnoreError(f):
    @wraps(f)
    def wrapper():
        try:
            f()
        except ZeroDivisionError:
            pass
    return wrapper

@IgnoreError
def func1():
    x = 5/0

func1()
在您的情况下,您必须定义此函数:

def IgnoreError(f):
    def wrapper(*args, **kwargs):
        try:
            f(*args, **kwargs)
        except RuntimeError:
            pass
    return wrapper
然后,每当您创建一个可能引发RuntimeError的函数时,只需将decorator
@IgnoreError
放在您的定义之前,如下所示:

@IgnoreError
def func():
   <your code here>
@IgnoreError
def func():

(如果你想看TechWithTim讲解decorators的视频)

你可以使用customs decorators来实现这一点(我不知道你的python级别,但这不是最适合初学者的东西)。例如,此处的代码不会引发任何错误:

from functools import wraps

def IgnoreError(f):
    @wraps(f)
    def wrapper():
        try:
            f()
        except ZeroDivisionError:
            pass
    return wrapper

@IgnoreError
def func1():
    x = 5/0

func1()
在您的情况下,您必须定义此函数:

def IgnoreError(f):
    def wrapper(*args, **kwargs):
        try:
            f(*args, **kwargs)
        except RuntimeError:
            pass
    return wrapper
然后,每当您创建一个可能引发RuntimeError的函数时,只需将decorator
@IgnoreError
放在您的定义之前,如下所示:

@IgnoreError
def func():
   <your code here>
@IgnoreError
def func():

(如果你想看TechWithTim解释装饰程序的视频)

根据我的评论,我肯定会使用可能引发运行时错误的特定行调用中的捕获。这样可以避免意外地抑制另一个未预料到的错误

根据可能导致运行时错误的调用,我更喜欢使用装饰器模式来隐藏try-except逻辑。比如:

from functools import wraps


def catch_runtime_error(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except RuntimeError:
            pass  # or whatever handle you fancy

    return wrapper
然后您将使用它,如:

@catch_runtime_error
def the_function_that_raises(...):
    # whatever the body is

the_function_that_raises(...)
或者,您可以在代码中更直接地使用它:

def the_function_that_raises(...):
    # whatever the body is

catch_runtime_error(the_function_that_raises)(...)

根据我的评论,我肯定会在可能引发运行时错误的特定行调用中使用catch。这样可以避免意外地抑制另一个未预料到的错误

根据可能导致运行时错误的调用,我更喜欢使用装饰器模式来隐藏try-except逻辑。比如:

from functools import wraps


def catch_runtime_error(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except RuntimeError:
            pass  # or whatever handle you fancy

    return wrapper
然后您将使用它,如:

@catch_runtime_error
def the_function_that_raises(...):
    # whatever the body is

the_function_that_raises(...)
或者,您可以在代码中更直接地使用它:

def the_function_that_raises(...):
    # whatever the body is

catch_runtime_error(the_function_that_raises)(...)

总的来说,我认为第二种情况更好。通常情况下,除了在大块代码上尝试之外,这是一个不好的主意-您可能会错过一些您没有预料到的糟糕情况。对于可能引发错误的部分,它们是来自相同的调用还是混合调用?它们是对库的调用还是对您有更多控制权的代码的调用?根据需要的调用,可以使用某种装饰器模式或至少一个简单的函数隐藏try-except块。您可以尝试使用函数来执行通常抛出错误的命令,而不是封装可能抛出错误的每一行。在此函数中,您可以执行异常处理。从您的描述来看,似乎错误发生在类似的情况下。使用具有良好错误处理能力的函数或方法可能会为您省去一些麻烦。除了整个错误管理之外,如果您在删除的实例中遇到此类错误,那么您的代码可能会有问题。您是如何删除这些实例的?为什么您仍然尝试访问它们?@musicamante我有一个事件,每次按下一个键时都会调用该事件,但是我也有一个快捷方式-发生的情况是快捷方式删除(所有)元素,但随后调用该事件并尝试运行该元素的一个方法。令人惊讶的是,这不会使整个GUI/文件崩溃,但会抛出所述的运行时错误……这可能取决于“事件”是如何创建的以及之后调用什么。尽管如此,我不知道您是如何实现所有这些的,但是我不会让事情变得不必要的复杂,而是会尝试在调用元素的方法(或者一个简单的标志/属性,告诉您所有元素都已被清除)之前找到一种检查元素是否确实存在的方法。虽然python的一个习语是“请求原谅比允许容易”,但这并不意味着你应该始终遵循这个建议。一般来说,我认为第二种情况更好。通常情况下,除了在大块代码上尝试之外,这是一个不好的主意-您可能会错过一些您没有预料到的糟糕情况。对于可能引发错误的部分,它们是来自相同的调用还是混合调用?它们是对库的调用还是对您有更多控制权的代码的调用?根据需要的调用,可以使用某种装饰器模式或至少一个简单的函数隐藏try-except块。您可以尝试使用函数来执行通常抛出错误的命令,而不是封装可能抛出错误的每一行。在此函数中,您可以执行异常处理。根据你的描述是