Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python高效的异常处理_Python - Fatal编程技术网

Python高效的异常处理

Python高效的异常处理,python,Python,我正在尝试找出是否有一种更适合Python的方法来执行特定的错误处理任务。我想捕获多个特定的自定义异常,并根据捕获的异常执行特定的操作,例如使用特定的自定义退出代码,或添加特定的日志消息,等等。。。。但是,如果出现任何异常,我还希望发送一封电子邮件,说明脚本未成功完成,有退出代码,日志位于C:\foo\bar.txt 我知道我可以将我想做的每件事都包括在其中,除了: try: do_something() except CustomError1: exitcode = 1

我正在尝试找出是否有一种更适合Python的方法来执行特定的错误处理任务。我想捕获多个特定的自定义异常,并根据捕获的异常执行特定的操作,例如使用特定的自定义退出代码,或添加特定的日志消息,等等。。。。但是,如果出现任何异常,我还希望发送一封电子邮件,说明脚本未成功完成,有退出代码,日志位于C:\foo\bar.txt

我知道我可以将我想做的每件事都包括在其中,除了:

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