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)
>

Reply via email to