Python高效的异常处理
我正在尝试找出是否有一种更适合Python的方法来执行特定的错误处理任务。我想捕获多个特定的自定义异常,并根据捕获的异常执行特定的操作,例如使用特定的自定义退出代码,或添加特定的日志消息,等等。。。。但是,如果出现任何异常,我还希望发送一封电子邮件,说明脚本未成功完成,有退出代码,日志位于C:\foo\bar.txt 我知道我可以将我想做的每件事都包括在其中,除了:Python高效的异常处理,python,Python,我正在尝试找出是否有一种更适合Python的方法来执行特定的错误处理任务。我想捕获多个特定的自定义异常,并根据捕获的异常执行特定的操作,例如使用特定的自定义退出代码,或添加特定的日志消息,等等。。。。但是,如果出现任何异常,我还希望发送一封电子邮件,说明脚本未成功完成,有退出代码,日志位于C:\foo\bar.txt 我知道我可以将我想做的每件事都包括在其中,除了: try: do_something() except CustomError1: exitcode = 1
try:
do_something()
except CustomError1:
exitcode = 1
send_error_email(exitcode)
sys.exit(exitcode)
except CustomError2:
exitcode = 2
send_error_email(exitcode)
sys.exit(exitcode)
但我想知道是否有一种更具蟒蛇风格或更有效的方法。我在想象这样的事情
try:
do_something()
except CustomError1:
exitcode = 1
except CustomError2:
exitcode = 2
except ParrentCustomErrorClass:
send_error_email()
sys.exit(exitcode)
如果这很重要的话,我目前只能使用python 2.7,但需要能够在第三方应用程序允许的情况下将解决方案移植到3.x。您能在异常类型中定义退出代码吗
class ParentCustomErrorClass(Exception):
exitcode = 999
def send_error_email(self):
raise NotImplementedError()
def die_horribly(self):
import sys
self.send_error_email()
sys.exit(self.exitcode)
class CustomError1(ParentCustomErrorClass):
exitcode = 1
class CustomError2(ParentCustomErrorClass):
exitcode = 2
try:
do_something()
except ParentCustomErrorClass as ex:
ex.die_horribly()
您能在异常类型本身中定义退出代码吗
class ParentCustomErrorClass(Exception):
exitcode = 999
def send_error_email(self):
raise NotImplementedError()
def die_horribly(self):
import sys
self.send_error_email()
sys.exit(self.exitcode)
class CustomError1(ParentCustomErrorClass):
exitcode = 1
class CustomError2(ParentCustomErrorClass):
exitcode = 2
try:
do_something()
except ParentCustomErrorClass as ex:
ex.die_horribly()
我见过两个成语: 终于 与 或者如果你想吃饱
但是,如果您控制您的异常,并且它们不是库异常,那么我也很喜欢@scnerd的解决方案。如果你不想——并且想抓住ValueErrors或TypeErrors或其他什么,那么其中一个就是你要走的路 我见过两个成语: 终于 与 或者如果你想吃饱
但是,如果您控制您的异常,并且它们不是库异常,那么我也很喜欢@scnerd的解决方案。如果你不想——并且想抓住ValueErrors或TypeErrors或其他什么,那么其中一个就是你要走的路 关于使用dict存储异常,我有一个非常相似的想法,当我看到你的答案时,我正要发布它。我不知道这些推荐的方法。您能解释一下为什么在处理异常时再次定义dict更好吗?我曾经声明过一个公共字典errors,其中包含所有异常作为键,就像您一样,每当必须处理异常时,我都会执行类似的操作,除了tupleerrors.keys作为err:…code=errors.gettypeerr。这将是更少的代码,但可能没有那么快?它将一样快-略有不同,如果有的话。这取决于这是一种一次性的事情,还是你想经常这样做——在这种情况下,你的方式更好:我有一个非常类似的想法,就是使用dict来存储异常,当我看到你的答案时,我正要发布它。我不知道这些推荐的方法。您能解释一下为什么在处理异常时再次定义dict更好吗?我曾经声明过一个公共字典errors,其中包含所有异常作为键,就像您一样,每当必须处理异常时,我都会执行类似的操作,除了tupleerrors.keys作为err:…code=errors.gettypeerr。这将是更少的代码,但可能没有那么快?它将一样快-略有不同,如果有的话。这取决于这是一种一次性的事情,还是你想经常这样做——在这种情况下,你的方式会更好:我以前从来没有想过在错误类中添加错误处理,这听起来很愚蠢,但我并不认为它们是一个普通的类,所以感谢你的见解,将来可能会用到它。对于当前的项目,不幸的是,我无法控制错误类,因为我正在从第三方模块中捕获错误。我以前从未真正想过将错误处理添加到错误类中,这听起来很愚蠢,但我并不真的认为它们是一个普通类,因此感谢您的洞察力,并可能在将来使用它。不幸的是,对于当前的项目,我无法控制错误类,因为我正在从第三方模块捕获错误。
try:
do_something()
except Exception as e:
code = {
CustomError1: 1
CustomError2: 2
}.get(type(e))
if code is None:
raise
send_error_email(code)
...
if (code := {
CustomError1: 1
CustomError2: 2
}.get(type(e))) is not None:
send_error_email(code)
raise