On Tue, Jan 04, 2011 at 12:56:16AM +0200, Michael Goldish wrote:
> On 01/04/2011 12:06 AM, Eduardo Habkost wrote:
> > On Mon, Jan 03, 2011 at 07:22:17PM -0200, Eduardo Habkost wrote:
[...]
> > If you want to be extra careful, you can keep an index of contexts for
> > each exception ever seen, and clear it in _call_test_function() code,
> > instead of keeping only the last exception. But I think we can keep it
> > simple and just store info for the last exception.
>
> I think that's risky:
>
> try:
> vm.create() # context aware, raises an exception
> except:
> try:
> vm.destroy() # context aware, raises an exception
> except:
> pass
> raise
>
> The exception raised in VM.destroy() will override last_exception, and
> then whoever calls context_for_exception() will get the wrong context.
Correct.
> But I think this will work and it looks pretty clean:
>
> def _context_aware(fn, *args, **kwargs):
> new_context("")
> try:
> try:
> return fn(*args, **kwargs)
> except Exception, e:
> if not hasattr(e, "context"):
> e.context = get_context()
> raise sys.exc_info()[0], e, sys.exc_info()[2]
Wouldn't a simple "raise" (without any arguments) work here?
> finally:
> clear_context()
> This way we don't need to keep track of the last exception, and we even
> take care of the injection of .context here (instead of in test.py), so
> we don't need context_for_exception() at all.
> What do you think?
Looks good to me.
I did the 'is last_exception' trick because I assumed (incorrectly, I
guess) I couldn't set arbitrary attributes on Exception objects. I like
this solution (as long as you tested it and it works :).
> If this makes sense, I'd like to rewrite my patch using this decorator,
> unless you feel like doing so yourself.
Be my guest. :)
--
Eduardo
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html