Python 使用简单的“除外”有什么错?

Python 使用简单的“除外”有什么错?,python,except,Python,Except,我尝试使用PyAutoGui创建一个函数来检查屏幕上是否显示图像,并得出以下结论: def check_image_on_screen(image): try: pyautogui.locateCenterOnScreen(image) return True except: return False 它很好用,但PyCharm告诉我,除了光着身子,我不应该离开。这样离开有什么问题?有没有更合适的方法来创建相同的函数?除了会捕获您

我尝试使用PyAutoGui创建一个函数来检查屏幕上是否显示图像,并得出以下结论:

def check_image_on_screen(image):
    try:
        pyautogui.locateCenterOnScreen(image)
        return True
    except:
        return False
它很好用,但PyCharm告诉我,除了光着身子,我不应该离开。这样离开有什么问题?有没有更合适的方法来创建相同的函数?

除了会捕获您几乎肯定不想捕获的异常外,其他异常包括键盘中断,用户按Ctrl+C键,Python会引发诸如SystemExit之类的错误

如果您没有预期的特定异常,至少除了异常,它是所有常规异常的基本类型

这就是说:您使用except块从已知故障状态恢复。未知的故障状态通常是不可恢复的,在这些状态下致命地退出是正确的行为,这是Python解释器在未捕获异常的情况下自然要做的


捕获您知道如何处理的所有内容,并让其余部分向上传播调用堆栈,以查看是否有其他内容可以处理它。在本例中,您预期的错误是pyautogui.ImageNotFoundException

基本上,您没有利用该语言来帮助您发现问题。如果您使用Exception Exception作为ex:您可以做一些类似于记录异常的事情,并确切地知道发生了什么。

另请参见Wikipedia对此有一些很好的信息,它被称为Exception。我不确定这是否是它的副本。这是问为什么不裸除,而那是问我如何裸除。对于后者,一个很好的答案可能是前者,但这并不是重复的。一个你可能想要捕捉每个异常的例子是在使用数据库时。我认为多处理是另一个例子,以避免被阻塞的子进程完全终止池。您应该考虑这两种情况下的上下文管理器。这两个示例都是您希望使用Test/Field而不是尝试/不使用的示例。使用finally意味着您可以保证清除,但之后仍会传播异常。@AdamSmith确实,我们会重试通知,但如果它一直失败的话。我不想让这一切停止。我们意识到,在2021年的大松弛故障中,部署失败仅仅是因为无法发送松弛通知