When using MonkeyRunner, every so often I get an error like:
120830 18:39:32.755:S [MainThread] [com.android.chimpchat.adb.AdbChimpDevice] Unable to get variable: display.density
120830 18:39:32.755:S [MainThread] [com.android.chimpchat.adb.AdbChimpDevice]java.net.SocketException: Connection reset
From what I’ve read, sometimes the adb connection goes bad, and you need to reconnect. The only problem is, I’m not able to catch the SocketException. I’ll wrap my code like so:
try:
density = self.device.getProperty('display.density')
except:
print 'This will never print.'
But the exception is apparently not raised all the way to the caller. I’ve verified that MonkeyRunner/jython can catch Java exceptions the way I’d expect:
>>> from java.io import FileInputStream
>>> def test_java_exceptions():
... try:
... FileInputStream('bad mojo')
... except:
... print 'Caught it!'
...
>>> test_java_exceptions()
Caught it!
How can I deal with these socket exceptions?
Below is the workaround I ended up using. Any function that can suffer from adb failures just needs to use the following decorator:
Because this may create a new connection, you need to wrap your current connection in a Device object so that it can be changed. Here’s my Device class (most of the class is for convenience, the only thing that’s necessary is the
connectionmember:An example on how to use the decorator: