In the example you give, it's not better. It's best practice to catch exceptions as close to the point they're thrown to avoid catching unrelated exceptions of the same type.
try:
file = open(...)
except OpenErrors...:
# handle open exceptions
else:
try:
# do stuff with file
finally:
file.close()
As unfortunately verbose as this is, the withwith statement doesn't allow you to catch exceptions thrown during its evaluation. There was a suggestion to add exception handling to this effect on the mailing list:
with open(...) as file:
# do stuff with file
except OpenErrors...:
# handle open exceptions
But this was shot down.
Finally it's worth noting that you can directly enter and exit context managers like so:
file = open(...).__enter__()
file.__exit__(typ, val, tb)
This is described in more detail here and here.
As a general guideline, withwith statements excel for cases where exceptions are not expected, and the default "enter/open/acquire" behaviour is adequate. Examples include required files, and simple locking.