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 <windspi...@gmail.com> 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