I think it's too late to change the cancellation logic. Cancellation is
tricky.

On Sun, Dec 3, 2017 at 1:53 PM, Chris Jerdonek <chris.jerdo...@gmail.com>
wrote:

> On Sun, Dec 3, 2017 at 9:04 AM, Guido van Rossum <gu...@python.org> wrote:
> > Sounds like an implementation issue. The Future class has a boolean flag
> > indicating whether it's been cancelled, and everything then raises
> > CancelledError when that flag is set. I suppose we could replace that
> flag
> > with an instance of CancelledError, and when we *catch* CancelledError we
> > set it to that. But it seems messy and I'm not sure that you should
> attempt
> > this. IMO you should define an exception that does *not* derive from
> > CancelledError and raise that -- it will properly be transmitted. What's
> > your reason for not doing that? IOW why are you trying to pump more than
> a
> > bit through the narrow "cancelled" channel?
>
> My use case is mostly for diagnostic / logging purposes. I want to log
> all exceptions bubbling out of a task, and I want to do so from within
> the coroutine itself rather than when I call task.result(). I also
> want to be able to detect if something wasn't logged when I call
> task.result() (to avoid double logging and errors passing silently,
> etc), and I'd also prefer that task.cancelled(), etc. still return the
> correct values.
>
> My first idea was to define LoggedError(Exception) and
> LoggedCancelledError(CancelledError) subclasses, and raise a new
> exception from within the task after logging. If LoggedCancelledError
> doesn't derive from CancelledError, then task.cancelled() won't
> reflect that the task was cancelled.
>
> Could it simplify things on the asyncio side if the CancelledError and
> non-CancelledError code paths shared more logic (e.g. by both setting
> an exception instead of only the generic case setting an exception)?
>
> --Chris
>
>
> >
> > On Sun, Dec 3, 2017 at 2:11 AM, Andrew Svetlov <andrew.svet...@gmail.com
> >
> > wrote:
> >>
> >> IIRC at very early stages Guido van Rossum decided to *freeze*
> >> `CancelledError`: user code should not derive from the exception. Like
> you
> >> never derive from StopIteration.
> >>
> >> On Sun, Dec 3, 2017 at 8:00 AM Chris Jerdonek <chris.jerdo...@gmail.com
> >
> >> wrote:
> >>>
> >>> Hi, I want to ask how people feel about the following.
> >>>
> >>> If you raise a subclass of CancelledError from within a task and then
> >>> call task.result(), CancelledError is raised rather than the subclass.
> >>>
> >>> Here is some code to illustrate:
> >>>
> >>>     class MyCancelledError(CancelledError): pass
> >>>
> >>>     async def raise_my_cancel():
> >>>         raise MyCancelledError()
> >>>
> >>>     task = asyncio.ensure_future(raise_my_cancel())
> >>>     try:
> >>>         await task
> >>>     except Exception:
> >>>         pass
> >>>     assert task.cancelled()
> >>>     # Raises CancelledError and not MyCancelledError.
> >>>     task.result()
> >>>
> >>> Does this seem right to people? Is there a justification for this?
> >>>
> >>> If it would help for the discussion, I could provide a use case.
> >>>
> >>> Thanks a lot,
> >>> --Chris
> >>> _______________________________________________
> >>> Async-sig mailing list
> >>> Async-sig@python.org
> >>> https://mail.python.org/mailman/listinfo/async-sig
> >>> Code of Conduct: https://www.python.org/psf/codeofconduct/
> >>
> >> --
> >> Thanks,
> >> Andrew Svetlov
> >>
> >> _______________________________________________
> >> Async-sig mailing list
> >> Async-sig@python.org
> >> https://mail.python.org/mailman/listinfo/async-sig
> >> Code of Conduct: https://www.python.org/psf/codeofconduct/
> >>
> >
> >
> >
> > --
> > --Guido van Rossum (python.org/~guido)
>



-- 
--Guido van Rossum (python.org/~guido)
_______________________________________________
Async-sig mailing list
Async-sig@python.org
https://mail.python.org/mailman/listinfo/async-sig
Code of Conduct: https://www.python.org/psf/codeofconduct/

Reply via email to