确保在Python中捕获所有异常

时间:2011-07-25 14:03:46

标签: python exception

我已经在Python中编程了一段时间,但我的努力主要是创​​建小实用程序脚本。我认为Python是一种很棒的语言,因为它很有趣,它可以很容易地编写干净的代码。

然而,有一个烦恼我还没有找到治愈方法:由于它具有动态特性,可以从各种来源抛出异常,如果它们没有被捕获它们会杀死你的程序。对我来说,这对“大”计划来说是一种痛苦。

在Java中(并不是我比我更了解Java),编译器实际上静态地强制执行异常处理,以便捕获所有可能的异常。是否有可能用Python实现相同的目标?

5 个答案:

答案 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.

我用这个来确保在崩溃后事情处于理智的状态。如果你的“优雅崩溃”代码依赖于抛出异常的任何东西......请谨慎使用;)