On 03/17/2011 11:16 AM, mark florisson wrote:
On 17 March 2011 10:08, Dag Sverre Seljebotn<d.s.seljeb...@astro.uio.no>  wrote:

How about this compromise: We balk on the code you wrote with:

Error line 345: Exceptions propagating from "with gil" block cannot be
propagated out of function, please insert try/except and handle exception

So that we require this:

with gil:
    try:
        ...
    except:
        warnings.warning(...) # or even cython.unraisable(e)

This keeps me happy about not abusing the with statement for strange control
flow, and makes the "with gil" useful for raising exceptions inside regular
def functions with nogil blocks.

I agree with your previous statement, but not with your compromise :).
We have to differentiate between two cases, similar to Stefan's cases,
but different in a very important way that matter for nested GIL
blocks.

1) Exceptions can propagate to some outer GIL section (in or outside
the current function)
2) Exceptions can't propagate, because there is no outer GIL section
and the function has a non-object return type

With your compromise, with 1) exceptions cannot propagate, but with 2)
you win forcing the user to be explicit. But then you still need to
write to some variable indicating that an exception occurred and
adjust control flow accordingly in your nogil section (unless you want
to clean up and return immediately).

If you have Python with-statement semantics, you can do the following,
for instance:

cdef void func() nogil:
     with gil:
         try:

             with nogil:
                 with gil:
                     code that may raise an exception

                 this is not executed

         except ExceptionRaisedFromInnerWithGilBlock:
             handle exception here

The point is, if you have case 2), and you want to use GIL code, you
need to handle exceptions in some way. Forcing the user to not
propagate anything doesn't sound right, unless this holds only for the
outermost 'with gil' block. I would be OK with that, although it would
be inconsistent with how exceptions in normal cdef functions with
non-object return work, so I would say that we'd have to force it in
the same manner there.

I think we should perhaps look at enforcing explicit exception-ignoring everywhere.. there's a lot of details to hash out, and there's the issue of backwards compatability, but it could be dealt with with a couple of releases where we only raise a warning and so on.

It could involve a *very* limited subset of exception handling for use in nogil mode (i.e., only a bare "except:" statement allowed, where one can call either "cython.unraisable()", "pass", or set a flag).

Dag Sverre
_______________________________________________
cython-devel mailing list
cython-devel@python.org
http://mail.python.org/mailman/listinfo/cython-devel

Reply via email to