在以下代码段中:
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的实例,它是我们的一个代理助手类的实例.
我相信您的猜测在比较的工作方式上是正确的,并且拦截的唯一方法是将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的定义.
| 归档时间: |
|
| 查看次数: |
446 次 |
| 最近记录: |