如何在except子句中比较异常

Gor*_*ley -2 python exception

在以下代码段中:

try:
    raise Bob()
except Fred:
    print "blah"
Run Code Online (Sandbox Code Playgroud)

Bob和Fred的比较是如何实现的?

从玩起来它似乎是在下面调用isinstance,这是正确的吗?

我问,因为我试图颠覆这个过程,特别是我希望能够构造一个Bob,使得它被execpt Fred捕获,即使它实际上不是Fred或其任何子类的实例.

有几个人问我为什么要这样做......

我们有一个RMI系统,它围绕着使它尽可能无缝的理念,这里是一个使用它的快速示例,请注意RMI系统中没有特定于套接字的代码,套接字只是提供了一个方便的例子.

import remobj
socket = remobj.RemObj("remote_server_name").getImport("socket")
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(("", 0))
print "listening on port:", s.getsockname()[1]
s.settimeout(10)
try:
    print "received:", s.recv(2048)
except socket.timeout:
    print "timeout"
Run Code Online (Sandbox Code Playgroud)

现在在这个特定的例子中,except不能按预期工作,因为raise对象不是socket.timeout的实例,它是我们的一个代理助手类的实例.

Nic*_*rry 6

我相信您的猜测在比较的工作方式上是正确的,并且拦截的唯一方法是将Fred添加为Bob的基类.例如:

# Assume both Bob and Fred are derived from Exception
>>> class Bob(Bob, Fred):
...     pass
... 
>>> try:
...     raise Bob()
... except Fred:
...     print 'blah'
blah
Run Code Online (Sandbox Code Playgroud)

据我所知,这是使它在编写时工作的唯一方法.但是,如果您只是将except:line重写为

... except (Bob, Fred):
Run Code Online (Sandbox Code Playgroud)

它会捕获Bob和Fred,而不需要修改Bob的定义.