Hor*_*Fat 86 python exception pep8
使用PyCharm IDE时,except:
无异常类型的使用会触发IDE提醒此异常子句Too broad
.
我应该忽略这个建议吗?或者是Pythonic总是具体的异常类型?
bab*_*unk 82
指定显式异常类型几乎总是更好.如果你使用一个裸except:
子句,你最终可能会捕获除了你期望捕获的异常之外的异常 - 这可以隐藏错误或者当它们没有按照你期望的方式调试程序时更难.
例如,如果要在数据库中插入行,则可能需要捕获指示该行已存在的异常,以便您可以执行更新.
try:
insert(connection, data)
except:
update(connection, data)
Run Code Online (Sandbox Code Playgroud)
如果指定裸except:
,则还会捕获套接字错误,指示数据库服务器已经崩溃.最好只捕获你知道如何处理的异常 - 程序通常在异常点失败而不是继续但是以奇怪的意外方式运行.
您可能想要使用裸设备的一种情况except:
是您需要始终运行的程序的顶层,例如网络服务器.但是,你需要非常小心地记录异常,否则就不可能弄清楚出了什么问题.基本上,程序中最多只能有一个地方可以执行此操作.
其推论这一切是你的代码不应该这样做raise Exception('some message')
,因为它迫使客户端代码使用except:
(或except Exception:
这是几乎一样糟糕).您应该定义一个特定于您想要发出的问题的异常(可能从某些内置的异常子类继承,如ValueError
或TypeError
).或者你应该提出一个特定的内置异常.这使您的代码用户可以小心地捕获他们想要处理的异常.
ash*_*shr 36
你不应该忽视翻译给你的建议.
从PEP-8样式指南Python:
捕获异常时,请尽可能提及特定异常,而不是使用bare except子句.
例如,使用:
try:
import platform_specific_module
except ImportError:
platform_specific_module = None
Run Code Online (Sandbox Code Playgroud)
一个裸的except:子句将捕获SystemExit和KeyboardInterrupt异常,使得用Control-C中断程序变得更加困难,并且可以掩盖其他问题.如果你想捕获所有发出程序错误信号的异常,请使用除Exception :(裸除了除了BaseException之外).
一个好的经验法则是将裸"除"子句的使用限制为两种情况:
如果异常处理程序将打印出来或记录回溯; 至少用户会意识到发生了错误.如果代码需要做一些清理工作,但随后让异常向上传播并加注.尝试...终于可以更好地处理这种情况.
这对Python没有特别的说明.
异常的全部意义在于尽可能地将问题处理到尽可能接近的地方.
因此,您可以保留在特殊情况下可能触发问题的代码以及彼此"下一步"的解决方案.
问题是你无法知道一段代码可能抛出的所有异常.你可以知道的是,如果它是一个文件未找到异常,那么你可以捕获它并提示用户获取一个执行或取消该功能.
如果你把try catch放在那里,那么无论你的文件例程中有什么问题(只读,权限,UAC,不是真正的pdf等),每一个都会插入你的文件中找不到catch和你的用户是尖叫"但它在那里,这个代码是垃圾"
现在有几种情况你可能会抓住一切,但应该有意识地选择它们.
它们是catch,撤消一些本地操作(例如创建或锁定资源,(例如在磁盘上打开文件以进行写入),然后再次抛出异常,以便在更高级别处理)
另一个你不关心它为什么出错了.例如打印.你可能有一个全面的问题,说你的打印机有问题,请整理出来,而不是因为它而杀死应用程序.如果您的代码使用某种计划执行一系列单独的任务,Ona类似的徒劳,您将不希望整个事情死亡,因为其中一个任务失败了.
注意如果您执行上述操作,我不能建议某种异常日志记录,例如try catch log end,足够高.
始终指定异常类型,有很多类型您不想捕获,例如SyntaxError
,KeyboardInterrupt
等MemoryError
。