我正在使用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以外的内容,也应该只是语法上的区别。一种方法比另一种更标准,或者是否有另一种实现这一目标的标准途径?
答案 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">
>
</button>
</div>
如果发生我的错误,则会看到错误消息“我的错误”。如果发生未知异常,那么它将显示默认异常处理程序的文本。无论哪种情况,都会引发异常并停止脚本。