我已经在Python中编程了一段时间,但我的努力主要是创建小实用程序脚本。我认为Python是一种很棒的语言,因为它很有趣,它可以很容易地编写干净的代码。
然而,有一个烦恼我还没有找到治愈方法:由于它具有动态特性,可以从各种来源抛出异常,如果它们没有被捕获它们会杀死你的程序。对我来说,这对“大”计划来说是一种痛苦。
在Java中(并不是我比我更了解Java),编译器实际上静态地强制执行异常处理,以便捕获所有可能的异常。是否有可能用Python实现相同的目标?
答案 0 :(得分:3)
您可以使用简单的except:
语句捕获所有异常。但这被认为是危险的,因为这也包括语法错误。
最佳做法是使用一个except
子句涵盖所有可能的和预期的异常类型。请考虑以下示例:
except (IOError, ArgumentError), e:
print(e)
此示例捕获两个预期的异常,所有其他异常将落实并将写入stderr
。
答案 1 :(得分:2)
所以,其他人已经回答了通常捕获异常的方法。我会采取略微不同的弯曲。我想你所问的是如何实现静态类型语言中出现的同类安全性。
首先,你可能不想。 python的一个优点是duck typing。来自维基百科:
duck typing是一种动态类型,其中对象的当前方法和属性集确定有效语义,而不是从特定类或特定接口的实现继承
duck typing的优点是你不必进行类型检查,你可以传递任何具有给定方法的对象。
然而,您遇到了问题:“如果不运行代码,我们如何始终检查我的代码是否正确?”当错误仅作为边缘情况发生时,这尤其令人讨厌。即使在更改代码库时,确保一致行为的一种好方法是编写unit tests。 Python有许多不同的实现单元测试的方法。最简单的可能是doctest模块。但是,如果您想要更强大的功能,那么还有unittest和unittest兼容的第三方框架nose。
单元测试的好处是你可以随时编写它们,确保查找不常见的边缘情况,然后在对程序进行重大更改时运行它们。然后,如果测试失败,你知道你已经破坏了什么。
答案 2 :(得分:1)
嗯,你可以选择捕捉一般的例外,但这不是一种好的做法。
try:
# Execute code here
except Exception:
# Log error
更好的方法是捕获您知道可能发生的特定异常,这样您就可以找到一种特定的方法来处理它们。没有什么比捕捉你不知道的例外更糟糕了。
答案 3 :(得分:1)
您可能需要查看sys.excepthook:
当引发异常并且未被捕获时,解释器会调用 sys.excepthook有三个参数,异常类,异常 实例和回溯对象。在这个交互式会话中 在控制返回到提示之前发生;在Python中 程序会在程序退出之前发生。处理 可以通过分配另一个来定制这种顶级异常 sys.excepthook的三参数函数。
示例:
def except_hook(type, value, tback):
# manage unhandled exception here
sys.__excepthook__(type, value, tback) # then call the default handler - if you need to
sys.excepthook = except_hook
答案 4 :(得分:0)
try:
# the body of your main loop or whatever
except Exception:
# Import the traceback and system modules
import traceback, sys
# Prepare the arguments
exc_type, exc_value, exc_traceback = sys.exc_info()
# Print the exception. There are more args -- read the traceback docs!
traceback.print_exception(exc_type, exc_value, exc_traceback)
# This is where your house-cleaning code goes.
我用这个来确保在崩溃后事情处于理智的状态。如果你的“优雅崩溃”代码依赖于抛出异常的任何东西......请谨慎使用;)