使用裸露的“除外”有啥问题? [复制]
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[,] 有啥区别? [复制]