使用裸露的'除外'有什么问题?

Cai*_*lio 15 python except bare pyautogui

我尝试使用PyAutoGui创建一个函数来检查屏幕上是否显示图像,并提出了这个:

def check_image_on_screen(image):
    try:
        pyautogui.locateCenterOnScreen(image)
        return True
    except:
        return False
Run Code Online (Sandbox Code Playgroud)

它工作正常,但PyCharm告诉我,我不应该except裸露.把它留下来有什么问题?有没有更合适的方法来创建相同的功能?

Ada*_*ith 21

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

如果您没有特定的异常,那么至少except Exception,它是所有"常规"异常的基本类型.


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

抓住你知道如何处理的所有东西,让其余的东西在调用堆栈中传播,看看是否有别的东西可以处理它.在这种情况下,您期望的错误(根据文档)是pyautogui.ImageNotFoundException

  • 您可能希望捕获每个异常的一个示例是使用数据库时。捕获所有并进行一些清理。 (2认同)
  • 我相信多处理是另一个例子,以避免卡住的子进程充分终止池。 (2认同)
  • 这些都是您可能想要使用“try/finally”而不是“try/ except”的示例。使用finally意味着你可以保证清理,但之后异常仍然会传播。 (2认同)

Cha*_*tin 20

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