确保在Python中捕获所有异常
我已经编程Python一段时间了,不过我主要是在写一些小工具脚本。我觉得Python是一门很棒的语言,因为它有趣,而且写出来的代码很干净。
不过,有一个让我烦恼的问题我还没找到解决办法:由于Python是动态语言,异常(也就是错误)可能来自不同的地方,如果不处理这些异常,它们会直接导致程序崩溃。对我来说,这在写一些“稍微大一点”的程序时真的很麻烦。
在Java中(虽然我对Java的了解不比Python多),编译器会强制要求处理所有可能的异常,确保它们都被捕获。那在Python中,有没有办法做到这一点呢?
5 个回答
其实,你可以选择捕捉所有的异常,但这样做并不是一个好习惯。
try:
# Execute code here
except Exception:
# Log error
更好的方法是捕捉那些你知道可能会发生的具体异常,这样你就能找到针对它们的解决办法。捕捉一个你完全不知道的异常是最糟糕的情况。
其他人已经提供了一些捕捉异常的方法。我想从另一个角度来谈谈。我觉得你问的是如何在动态类型语言中实现类似静态类型语言的类型安全。
首先,你可能并不想这样做。Python 的一个优点就是它的鸭子类型。维基百科上是这么说的:
鸭子类型是一种动态类型风格,其中一个对象当前的方法和属性决定了有效的语义,而不是它从特定类继承或实现特定接口。
鸭子类型的好处在于你不需要进行类型检查,你可以传递任何具有特定方法的对象。
不过,这就带来了一个问题:“我怎么能在不运行代码的情况下,始终检查我的代码是否正确?”当错误只在某些边缘情况下出现时,这尤其让人烦恼。确保代码在修改时仍然表现一致的一个好方法是编写单元测试。Python 有多种实现单元测试的方法。最简单的可能是doctest模块。不过,如果你想要更强大的工具,还有unittest,以及与 unittest 兼容的第三方框架nose。
单元测试的好处在于你可以在编写代码的过程中逐步添加测试,确保考虑到即使是那些不常见的边缘情况,然后在你对程序进行重大更改时随时运行这些测试。如果测试失败了,你就知道哪里出了问题。
你可以用简单的 except:
语句来捕捉所有的异常情况。但这样做被认为是不安全的,因为它也会捕捉到语法错误。
最好的做法是用一个 except
语句来处理所有可能出现的、你可以预料到的异常类型。看看下面这个例子:
except (IOError, ArgumentError), e:
print(e)
这个例子会捕捉到两个预期中的异常,其他的异常则会被忽略,并记录到 stderr
中。