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

时间:2018-12-03 10:08:45

标签: python exception throw raise systemexit

我正在使用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)

但是,仅仅使用裸露的东西是令人讨厌的。是否在使用“例外树”而不是裸机来指定“除我已处理的例外之外的任何东西”,这是一种非标准方式?有没有更好的方法来实现这一目标?我仍然想记录这些未处理的异常,即使它们没有被处理。

编辑:引发SystemExit来指出已处理了一个异常-不管我遇到什么异常,我总是想停止运行脚本,因为任何失败都将导致绝对失败。

我问这个问题的主要原因是,PEP8似乎考虑使用裸露的除外作为错误,即使我可以使用BaseException以外的内容,也应该只是语法上的区别。一种方法比另一种更标准,或者是否有另一种实现这一目标的标准途径?

3 个答案:

答案 0 :(得分:0)

裸露异常会捕获您不想捕获的内容,例如GeneratorExit。这样做:

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

答案 1 :(得分:0)

最主要的问题是,它可以捕获诸如SystemExit和KeyboardInterrupt之类的东西,它们不是标准的“代码”错误,通常不应以与代码生成的异常相同的方式进行处理。使用Exception类不会覆盖这些情况,因为它们不会从中继承,因此它不仅仅是语法上的区别。

https://docs.python.org/2/howto/doanddont.html#except https://docs.python.org/3.1/howto/doanddont.html#except

如果要处理这些特定情况,最好像对SystemExit那样明确地进行处理。

答案 2 :(得分:0)

这对我有用:

  <form className="searchContainer" onSubmit={this.props.onSubmitForm}>
    <label>
      <p>Search</p>
      <input 
        type="text"
        value={this.props.value}
        onChange={this.props.onChangeValue}
        onKeyDown={this._handleKeyDown}
        className="searchBox" />
    </label>
    <button type="submit" className="searchButton">
      &gt;
    </button>
  </div>

如果发生我的错误,则会看到错误消息“我的错误”。如果发生未知异常,那么它将显示默认异常处理程序的文本。无论哪种情况,都会引发异常并停止脚本。