Thank You for explanation,
currently i am rising that exception as is.
but the whole point of calling set_exception() was to mark that task have
failed for sure,
and no future code should change that outcome for that task.
but the same time i don't want to exit it immediately, because i need to
log it somewhere and also
do a cleanup, and do clean shutdown of other facilities that task involved
with.
when i raise it - it just exits at once, making cleanup harder to
implement.
Anyway
Thanks!
On Wednesday, September 30, 2015 at 11:05:14 PM UTC-4, Guido van Rossum
wrote:
>
> You shouldn't do that. What's happening is that when task() returns the
> Task class wrapping it tries to set the Task object's result, but since
> you've already set a result, the second set_result() raises
> InvalidStateError. If you want to raise RuntimeError, just write `raise
> RuntimeError("msg")` in your function.
>
> Note that you could get the same error by using `myself.set_result(None)`.
> It's not specific to setting an exception, the problem is that the Task
> instance can't have its result or exeption set multiple times.
>
> On Wed, Sep 30, 2015 at 7:13 PM, Oleg K <[email protected] <javascript:>>
> wrote:
>
>> Hello everyone,
>>
>> here is super simple example of one case i ran into:
>>
>> import asyncio
>>
>> loop = asyncio.get_event_loop()
>> async def task():
>> print('i am task..')
>> myself.set_exception(RuntimeError('something bad'))
>> print('i keep working')
>>
>> myself = loop.create_task(task())
>> loop.run_forever()
>>
>>
>>
>> which will produce something strange,
>> i expected to see just a RuntimeError propagated.
>> but instead, here is what is happening:
>>
>> i am task..
>>> i keep working
>>> Exception in callback Task._step()
>>> handle: <Handle Task._step()>
>>> Traceback (most recent call last):
>>> File "/home/http/Python-3.5.0/lib/python3.5/asyncio/tasks.py", line
>>> 239, in _step
>>> result = coro.send(value)
>>> StopIteration
>>>
>>> During handling of the above exception, another exception occurred:
>>>
>>> Traceback (most recent call last):
>>> File "/home/http/Python-3.5.0/lib/python3.5/asyncio/events.py", line
>>> 125, in _run
>>> self._callback(*self._args)
>>> File "/home/http/Python-3.5.0/lib/python3.5/asyncio/tasks.py", line
>>> 241, in _step
>>> self.set_result(exc.value)
>>> File "/home/http/Python-3.5.0/lib/python3.5/asyncio/futures.py", line
>>> 335, in set_result
>>> raise InvalidStateError('{}: {!r}'.format(self._state, self))
>>> asyncio.futures.InvalidStateError: FINISHED: <Task finished coro=<task()
>>> done, defined at test_aio_exception.py:4> exception=RuntimeError('something
>>> bad',)>
>>>
>>
>>
>> i am sorry in advance if it is just something i don't understand at very
>> basic level about asyncio.
>>
>>
>> Regards,
>>
>> Oleg.
>>
>>
>
>
> --
> --Guido van Rossum (python.org/~guido)
>