Python异常-捕获除预期异常之外的所有异常

Python异常-捕获除预期异常之外的所有异常,python,exception,throw,raise,systemexit,Python,Exception,Throw,Raise,Systemexit,我正在用Python编写一个简单的自动化脚本,它可以在不同的位置抛出异常。在它们中,我想记录一条特定的消息并退出程序。为了做到这一点,我在捕获异常并进行处理(执行特定的日志记录操作等)后引发SystemExit 在main的顶级调用中,我执行以下操作: if __name__ == "__main__": try: main() except SystemExit: # handled exception sys.exit(1) exce

我正在用Python编写一个简单的自动化脚本,它可以在不同的位置抛出异常。在它们中,我想记录一条特定的消息并退出程序。为了做到这一点,我在捕获异常并进行处理(执行特定的日志记录操作等)后引发SystemExit

在main的顶级调用中,我执行以下操作:

if __name__ == "__main__":
    try:
        main()
    except SystemExit:  # handled exception
        sys.exit(1)
    except:  # any unhandled exception
        logging.error('Unexpected error: ', exc_info=True)
        sys.exit(2)
然而,使用裸除是令人不快的。在使用“异常树”的情况下,我使用一个裸露的except来指定“除了我处理过的异常以外的任何东西”是不是一种非标准的方法?有没有更好的方法来实现这一点?我仍然希望记录这些未处理的异常,即使它们未被处理

Edit:SystemExit被引发以注意异常已被处理-无论在我的情况下出现什么异常,我始终希望停止运行脚本,因为任何故障都会导致绝对故障


我问的主要原因是PEP8似乎考虑使用一个BULL,除了作为一个错误,即使我可以使用除BaseExchange之外,它应该只是一个句法上的差异。是否有一种方法比另一种方法更标准,或者是否有另一种实现这一点的标准方法?

裸异常会捕获您不想捕获的东西,例如
GeneratorExit
。这样做:

except Exception as details:
    logging.error('Unexpected error: {0}'.format(details))

bare except的主要问题是,它可以捕获SystemExit和KeyboardInterrupt等非标准“代码”错误,通常不应以与代码生成的异常相同的方式进行处理。使用Exception类不包括这些情况,因为它们不是从中继承的,所以它不仅仅是语法上的差异

如果您想处理这些特定情况,那么最好像处理SystemExit那样明确地处理这些情况。

这对我来说很有效:

try:
   <code>
   raise Exception("my error")
except Exception as e:
    raise e

如果发生我的错误,则会看到错误消息“my error”。如果发生未知异常,则会显示默认异常处理程序的文本。在这两种情况下,都会引发异常并暂停脚本。

这确实是一种可能的方法-使用BaseException而不是exception会更好吗,因为我会尝试记录任何未处理的异常?不,使用
Exception
而不是
BaseException
的全部意义在于
BaseException
s包含您通常不想捕获的异常。很明显,对不起,我指的是基本的“异常类”而不是“基本异常”类。顺便说一句,我认为停止代码并中断的更好方法(我认为这就是您在这里使用SystemExit的目的?)是定义您自己的错误并提出它。