使用裸露的“除外”有啥问题? [复制]

Posted

技术标签:

【中文标题】使用裸露的“除外”有啥问题? [复制]【英文标题】:What is wrong with using a bare 'except'? [duplicate]使用裸露的“除外”有什么问题? [复制] 【发布时间】:2019-07-23 17:13:23 【问题描述】:

我尝试使用 PyAutoGui 制作一个功能来检查屏幕上是否显示图像,结果如下:

def check_image_on_screen(image):
    try:
        pyautogui.locateCenterOnScreen(image)
        return True
    except:
        return False

它工作正常,但 PyCharm 告诉我我不应该让 except 裸露。像这样离开有什么问题?有没有更合适的方法来创建相同的函数?

【问题讨论】:

另见***.com/q/4990718/20670 ***有一些很好的信息——它叫做error hiding。 我不确定这是不是重复的。这是在问“为什么不裸露”,而那是在问“我如何裸露”。后者的答案可能会回答前者,但这不是重复的。 【参考方案1】:

except 将捕获您几乎肯定不想捕获的异常,包括 KeyboardInterrupt(用户按 Ctrl+C)和 Python 引发的错误,例如 SystemExit

如果您没有预期的特定异常,至少 except Exception,这是所有“常规”异常的基本类型。


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

捕获所有你知道如何处理的东西,然后让其余的东西在调用堆栈中传播,看看是否有其他东西可以处理它。在这种情况下,您期望的错误(每个the docs)是pyautogui.ImageNotFoundException

【讨论】:

使用数据库时,您可能希望捕获每个异常的一个示例。抓住一切并做一些清理工作。 我相信多处理是另一个例子,以避免卡住的子进程充分终止池。 您应该考虑这两种情况的上下文管理器。 这些都是您可能希望使用try/finally 而不是try/except 的示例。使用 finally 意味着您可以保证清理,但之后仍然会传播异常。 @AdamSmith 确实,我们会重试通知,但如果它一直失败。我不希望这阻止一切。我们意识到,在 2021 年的 Slack 大失败中,部署失败仅仅是因为他们无法发送 Slack 通知【参考方案2】:

基本上,您并没有利用语言来帮助您发现问题。如果您使用except Exception as ex:,您可以执行诸如记录异常并确切知道发生了什么的事情。

【讨论】:

以上是关于使用裸露的“除外”有啥问题? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

jQuery UI Datepicker - 为啥它是裸露的?

使用 int[][] 和 int[,] 有啥区别? [复制]

使用 INNER JOIN 有啥好处? [复制]

使用 UTF-8 优于 UTF-16 有啥优势? [复制]

使用 GetType() 和 typeof() 获取 Type 有啥区别? [复制]

使用#!/bin/php 有啥好处? [复制]